Subversion Repositories public

Rev

Rev 274 | Rev 276 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 274 Rev 275
Line 15... Line 15...
15
#include <QLabel>
15
#include <QLabel>
16
#include <QString>
16
#include <QString>
17
#include <QXmlReader>
17
#include <QXmlReader>
18
#include <QDir>
18
#include <QDir>
19
#include <QColor>
19
#include <QColor>
-
 
20
#include <QImage>
20
#include <KStandardDirs>
21
#include <KStandardDirs>
21
#include <KConfig>
22
#include <KConfig>
22
#include <KLocale>
23
#include <KLocale>
23
#include <KMessageBox>
24
#include <KMessageBox>
24
#include <KGlobalSettings>
25
#include <KGlobalSettings>
25
#include <KConfigGroup>
26
#include <KConfigGroup>
-
 
27
#include <KIconLoader>
26
 
28
 
27
#include "config.h"
29
#include "config.h"
28
#include "render.h"
30
#include "render.h"
29
#include <iostream>
31
#include <iostream>
30
 
32
 
Line 63... Line 65...
63
#define ATT_MAXDISTANCE		312
65
#define ATT_MAXDISTANCE		312
64
#define ATT_PLACEMENT		313
66
#define ATT_PLACEMENT		313
65
#define ATT_ALLOWOVERLAP	314
67
#define ATT_ALLOWOVERLAP	314
66
#define ATT_STATUS		315
68
#define ATT_STATUS		315
67
#define ATT_SRS			316
69
#define ATT_SRS			316
-
 
70
#define ATT_DX			317
68
 
71
 
69
#define FIRST_CON		100
72
#define FIRST_CON		100
70
#define LAST_CON		111
73
#define LAST_CON		111
71
 
74
 
72
#define FIRST_FLD		200
75
#define FIRST_FLD		200
73
#define LAST_FLD		205
76
#define LAST_FLD		205
74
 
77
 
75
#define FIRST_ATT		300
78
#define FIRST_ATT		300
76
#define LAST_ATT		316
79
#define LAST_ATT		317
77
 
80
 
78
using std::cout;
81
using std::cout;
79
using std::cerr;
82
using std::cerr;
80
using std::clog;
83
using std::clog;
81
using std::endl;
84
using std::endl;
Line 91... Line 94...
91
	{ CON_TEXTSYMBOLIZER,		in_textsymbolizer,	QString("TextSymbolizer") },
94
	{ CON_TEXTSYMBOLIZER,		in_textsymbolizer,	QString("TextSymbolizer") },
92
	{ CON_POLYGONPATTERNSYMBOLIZER,	in_polygonpatternsymbolizer,	QString("PolygonPatternSymbolizer") },
95
	{ CON_POLYGONPATTERNSYMBOLIZER,	in_polygonpatternsymbolizer,	QString("PolygonPatternSymbolizer") },
93
	{ CON_LAYER,			in_layer,		QString("Layer") },
96
	{ CON_LAYER,			in_layer,		QString("Layer") },
94
	{ CON_DATASOURCE,		in_datasource,		QString("Datasource") },
97
	{ CON_DATASOURCE,		in_datasource,		QString("Datasource") },
95
	{ CON_SHIELDSYMBOLIZER,		in_shieldsymbolizer,	QString("ShieldSymbolizer") },
98
	{ CON_SHIELDSYMBOLIZER,		in_shieldsymbolizer,	QString("ShieldSymbolizer") },
-
 
99
	{ CON_LINEPATTERNSYMBOLIZER,	in_linepatternsymbolizer, QString("LinePatternSymbolizer") },
96
	// Fields
100
	// Fields
97
	{ FLD_FILTER,			in_rule,		QString("Filter") },
101
	{ FLD_FILTER,			in_rule,		QString("Filter") },
98
	{ FLD_CSSPARAMETER,		in_symbolizer,		QString("CSSParameter") },
102
	{ FLD_CSSPARAMETER,		in_symbolizer,		QString("CSSParameter") },
99
	{ FLD_MINSCALE,			in_rule,		QString("MinScaleDenominator") },
103
	{ FLD_MINSCALE,			in_rule,		QString("MinScaleDenominator") },
100
	{ FLD_MAXSCALE,			in_rule,		QString("MaxScaleDenominator") },
104
	{ FLD_MAXSCALE,			in_rule,		QString("MaxScaleDenominator") },
Line 107... Line 111...
107
	{ ATT_TYPE,			in_symbolizer,		QString("type") },
111
	{ ATT_TYPE,			in_symbolizer,		QString("type") },
108
	{ ATT_WIDTH,			in_symbolizer,		QString("width") },
112
	{ ATT_WIDTH,			in_symbolizer,		QString("width") },
109
	{ ATT_HEIGHT,			in_symbolizer,		QString("height") },
113
	{ ATT_HEIGHT,			in_symbolizer,		QString("height") },
110
	{ ATT_SIZE,			in_symbolizer,		QString("size") },
114
	{ ATT_SIZE,			in_symbolizer,		QString("size") },
111
	{ ATT_FACENAME,			in_symbolizer,		QString("face_name") },
115
	{ ATT_FACENAME,			in_symbolizer,		QString("face_name") },
-
 
116
	{ ATT_DX,			in_symbolizer,		QString("dx") },
112
	{ ATT_DY,			in_symbolizer,		QString("dy") },
117
	{ ATT_DY,			in_symbolizer,		QString("dy") },
113
	{ ATT_HALORADIUS,		in_symbolizer,		QString("halo_radius") },
118
	{ ATT_HALORADIUS,		in_symbolizer,		QString("halo_radius") },
114
	{ ATT_WRAPWIDTH,		in_symbolizer,		QString("wrap_width") },
119
	{ ATT_WRAPWIDTH,		in_symbolizer,		QString("wrap_width") },
115
	{ ATT_MINDISTANCE,		in_symbolizer,		QString("min_distance") },
120
	{ ATT_MINDISTANCE,		in_symbolizer,		QString("min_distance") },
116
	{ ATT_MAXDISTANCE,		in_symbolizer,		QString("max_distance") },
121
	{ ATT_MAXDISTANCE,		in_symbolizer,		QString("max_distance") },
Line 134... Line 139...
134
	TextSymbolizer = 0;
139
	TextSymbolizer = 0;
135
	PointSymbolizer = 0;
140
	PointSymbolizer = 0;
136
	PolygonPatternSymbolizer = 0;
141
	PolygonPatternSymbolizer = 0;
137
	ShieldSymbolizer = 0;
142
	ShieldSymbolizer = 0;
138
	LinePatternSymbolizer = 0;
143
	LinePatternSymbolizer = 0;
-
 
144
	_lx = _ly = 180.0;
-
 
145
	_rx = _ry = -180.0;
139
	// This is true, when a XML file was parsed successfully
146
	// This is true, when a XML file was parsed successfully
140
	ControlSet = false;
147
	ControlSet = false;
141
 
148
 
142
	// Read settings from config file
149
	// Read settings from config file
143
	KConfig cfg (QString("sportwatcher.rc"), KConfig::SimpleConfig);
150
	KConfig cfg (QString("sportwatcher.rc"), KConfig::SimpleConfig);
Line 179... Line 186...
179
 
186
 
180
SRender::~SRender()
187
SRender::~SRender()
181
{
188
{
182
	startDocument();	// Clean everything
189
	startDocument();	// Clean everything
183
	ControlSet = false;
190
	ControlSet = false;
-
 
191
 
-
 
192
	if (!OutBuf.isEmpty())
-
 
193
	   unlink (OutBuf.toAscii().data());
184
}
194
}
185
 
195
 
186
bool SRender::startDocument()
196
bool SRender::startDocument()
187
{
197
{
188
	m.remove_all();		// delete styles and layers from map
198
	m.remove_all();		// delete styles and layers from map
Line 284... Line 294...
284
	      Lay = akt;
294
	      Lay = akt;
285
	   }
295
	   }
286
	}
296
	}
287
 
297
 
288
	Lay = firstLayer = lastLayer = 0;
298
	Lay = firstLayer = lastLayer = 0;
-
 
299
	Rule = 0;
-
 
300
	LineSymbolizer = 0;
-
 
301
	PolygonSymbolizer = 0;
-
 
302
	TextSymbolizer = 0;
-
 
303
	PointSymbolizer = 0;
-
 
304
	PolygonPatternSymbolizer = 0;
-
 
305
	ShieldSymbolizer = 0;
-
 
306
	LinePatternSymbolizer = 0;
-
 
307
	_lx = _ly = 180.0;
-
 
308
	_rx = _ry = -180.0;
-
 
309
	ControlSet = false;
-
 
310
	XmlLine = 1;
289
	Container = in_root;
311
	Container = in_root;
290
	return true;
312
	return true;
291
}
313
}
292
 
314
 
293
/*
315
/*
Line 312... Line 334...
312
		 case CON_MAP:
334
		 case CON_MAP:
313
		    Container = in_map;
335
		    Container = in_map;
314
 
336
 
315
		    if (ControlSet)	// Must be false here!
337
		    if (ControlSet)	// Must be false here!
316
		    {
338
		    {
317
		       KMessageBox::error(0, i18n("Error parsing %1: There is another MAP! Only one map information is allowed!").arg(XmlPath));
339
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: There is another MAP! Only one map information is allowed!").arg(XmlPath).arg(XmlLine));
318
		       return false;
340
		       return false;
319
		    }
341
		    }
320
 
342
 
321
		    if ((index = att.index(QString("bgcolor"))) != -1)
343
		    if ((index = att.index(QString("bgcolor"))) != -1)
-
 
344
		    {
-
 
345
		    color col;
-
 
346
 
322
		       MapPars.bgcolor = colorToUInt(att.value(index));
347
		       MapPars.bgcolor = colorToUInt(att.value(index));
-
 
348
		       col.set_bgr(MapPars.bgcolor);
-
 
349
		       m.set_background(col);
-
 
350
		    }
323
 
351
 
324
		    if ((index = att.index(QString("buffer_size"))) != -1)
352
		    if ((index = att.index(QString("buffer_size"))) != -1)
-
 
353
		    {
325
		       MapPars.buf_size = att.value(index).toInt();
354
		       MapPars.buf_size = att.value(index).toInt();
-
 
355
		       m.set_buffer_size(MapPars.buf_size);
-
 
356
		    }
326
 
357
 
327
		    if ((index = att.index(QString("srs"))) != -1)
358
		    if ((index = att.index(QString("srs"))) != -1)
-
 
359
		    {
328
		       MapPars.srs = att.value(index);
360
		       MapPars.srs = att.value(index);
329
cout << "<Map bgcolor=" << MapPars.bgcolor << " buffer_size=" << MapPars.buf_size << " srs=" << MapPars.srs.toAscii().data() << ">" << endl;
361
		       m.set_srs(MapPars.srs.toAscii().data());
-
 
362
		    }
330
		 break;
363
		 break;
331
 
364
 
332
		 case CON_STYLE:
365
		 case CON_STYLE:
333
		    Container = in_style;
366
		    Container = in_style;
334
 
367
 
Line 346... Line 379...
346
 
379
 
347
		    if ((index = att.index(QString("name"))) != -1)
380
		    if ((index = att.index(QString("name"))) != -1)
348
		       Style->name = att.value(index);
381
		       Style->name = att.value(index);
349
		    else
382
		    else
350
		    {
383
		    {
351
		       KMessageBox::error(0, i18n("Error parsing %1: Open STYLE without a name!").arg(XmlPath));
384
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open STYLE without a name!").arg(XmlPath).arg(XmlLine));
352
		       return false;
385
		       return false;
353
		    }
386
		    }
354
cout << "   <Style name=" << Style->name.toAscii().data() << ">" << endl;
-
 
355
		 break;
387
		 break;
356
 
388
 
357
		 case CON_RULE:
389
		 case CON_RULE:
358
		    Container = in_rule;
390
		    Container = in_rule;
359
 
391
 
360
		    if (!Style)
392
		    if (!Style)
361
		    {
393
		    {
362
		       KMessageBox::error(0, i18n("Error parsing %1: Open RULE outside of a STYLE!").arg(XmlPath));
394
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open RULE outside of a STYLE!").arg(XmlPath).arg(XmlLine));
363
		       return false;
395
		       return false;
364
		    }
396
		    }
365
 
397
 
366
		    Rule = getLastRule (Style->rule);
398
		    Rule = getLastRule (Style->rule);
367
 
399
 
Line 373... Line 405...
373
		    else
405
		    else
374
		    {
406
		    {
375
		       Rule->next = allocRule();
407
		       Rule->next = allocRule();
376
		       Rule = Rule->next;
408
		       Rule = Rule->next;
377
		    }
409
		    }
378
cout << "      <Rule>" << endl;
-
 
379
		 break;
410
		 break;
380
 
411
 
381
		 case CON_LAYER:
412
		 case CON_LAYER:
382
		    Container = in_layer;
413
		    Container = in_layer;
383
 
414
 
Line 399... Line 430...
399
		    if ((index = att.index(QString("status"))) != -1)
430
		    if ((index = att.index(QString("status"))) != -1)
400
		       Lay->status = getBool(att.value(index));
431
		       Lay->status = getBool(att.value(index));
401
 
432
 
402
		    if ((index = att.index(QString("srs"))) != -1)
433
		    if ((index = att.index(QString("srs"))) != -1)
403
		       Lay->srs = att.value(index);
434
		       Lay->srs = att.value(index);
-
 
435
 
-
 
436
		    if ((index = att.index(QString("minzoom"))) != -1)
-
 
437
		       Lay->minzoom = att.value(index).toDouble();
-
 
438
 
-
 
439
		    if ((index = att.index(QString("maxzoom"))) != -1)
404
cout << "   <Layer name=" << Lay->name.toAscii().data() << " status=" << Lay->status << " srs=" << Lay->srs.toAscii().data() << ">" << endl;
440
		       Lay->maxzoom = att.value(index).toDouble();
405
		 break;
441
		 break;
406
 
442
 
407
		 case CON_DATASOURCE:
443
		 case CON_DATASOURCE:
408
		    Container = in_datasource;
444
		    Container = in_datasource;
409
		 break;
445
		 break;
Line 411... Line 447...
411
		 case CON_POINTSYMBOLIZER:
447
		 case CON_POINTSYMBOLIZER:
412
		    Container = in_pointsymbolizer;
448
		    Container = in_pointsymbolizer;
413
 
449
 
414
		    if (!Rule)
450
		    if (!Rule)
415
		    {
451
		    {
416
		       KMessageBox::error(0, i18n("Error parsing %1: Open POINTSYMBOLIZER outside of a RULE!").arg(XmlPath));
452
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open POINTSYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
417
		       return false;
453
		       return false;
418
		    }
454
		    }
419
 
455
 
420
		    PointSymbolizer = getLastPointSymbolizer(Rule->PointSymbolizer);
456
		    PointSymbolizer = getLastPointSymbolizer(Rule->PointSymbolizer);
421
 
457
 
Line 447... Line 483...
447
		       if (att.value(index).toLower() == QString("true"))
483
		       if (att.value(index).toLower() == QString("true"))
448
			  PointSymbolizer->allow_overlap = true;
484
			  PointSymbolizer->allow_overlap = true;
449
		       else
485
		       else
450
			  PointSymbolizer->allow_overlap = false;
486
			  PointSymbolizer->allow_overlap = false;
451
		    }
487
		    }
452
cout << "         <Pointsymbolizer file=" << PointSymbolizer->file.toAscii().data() << " ... >" << endl;
-
 
453
		 break;
488
		 break;
454
 
489
 
455
		 break;
490
		 break;
456
 
491
 
457
		 case CON_LINESYMBOLIZER:
492
		 case CON_LINESYMBOLIZER:
458
		    Container = in_linesymbolizer;
493
		    Container = in_linesymbolizer;
459
 
494
 
460
		    if (!Rule)
495
		    if (!Rule)
461
		    {
496
		    {
462
		       KMessageBox::error(0, i18n("Error parsing %1: Open LINESYMBOLIZER outside of a RULE!").arg(XmlPath));
497
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open LINESYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
463
		       return false;
498
		       return false;
464
		    }
499
		    }
465
 
500
 
466
		    LineSymbolizer = getLastLineSymbolizer(Rule->LineSymbolizer);
501
		    LineSymbolizer = getLastLineSymbolizer(Rule->LineSymbolizer);
467
 
502
 
Line 473... Line 508...
473
		    else
508
		    else
474
		    {
509
		    {
475
		       LineSymbolizer->next = allocLineSymbolizer();
510
		       LineSymbolizer->next = allocLineSymbolizer();
476
		       LineSymbolizer = LineSymbolizer->next;
511
		       LineSymbolizer = LineSymbolizer->next;
477
		    }
512
		    }
478
cout << "         <Linesymbolizer>" << endl;
-
 
479
		 break;
513
		 break;
480
 
514
 
481
		 case CON_POLYGONSYMBOLIZER:
515
		 case CON_POLYGONSYMBOLIZER:
482
		    Container = in_polygonsymbolizer;
516
		    Container = in_polygonsymbolizer;
483
 
517
 
484
		    if (!Rule)
518
		    if (!Rule)
485
		    {
519
		    {
486
		       KMessageBox::error(0, i18n("Error parsing %1: Open POLYGONSYMBOLIZER outside of a RULE!").arg(XmlPath));
520
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open POLYGONSYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
487
		       return false;
521
		       return false;
488
		    }
522
		    }
489
 
523
 
490
		    PolygonSymbolizer = getLastPolygonSymbolizer(Rule->PolygonSymbolizer);
524
		    PolygonSymbolizer = getLastPolygonSymbolizer(Rule->PolygonSymbolizer);
491
 
525
 
Line 497... Line 531...
497
		    else
531
		    else
498
		    {
532
		    {
499
		       PolygonSymbolizer->next = allocPolygonSymbolizer();
533
		       PolygonSymbolizer->next = allocPolygonSymbolizer();
500
		       PolygonSymbolizer = PolygonSymbolizer->next;
534
		       PolygonSymbolizer = PolygonSymbolizer->next;
501
		    }
535
		    }
502
cout << "         <Polygonsymbolizer>" << endl;
-
 
503
		 break;
536
		 break;
504
 
537
 
505
		 case CON_TEXTSYMBOLIZER:
538
		 case CON_TEXTSYMBOLIZER:
506
		    Container = in_textsymbolizer;
539
		    Container = in_textsymbolizer;
507
 
540
 
508
		    if (!Rule)
541
		    if (!Rule)
509
		    {
542
		    {
510
		       KMessageBox::error(0, i18n("Error parsing %1: Open TEXTSYMBOLIZER outside of a RULE!").arg(XmlPath));
543
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open TEXTSYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
511
		       return false;
544
		       return false;
512
		    }
545
		    }
513
 
546
 
514
		    TextSymbolizer = getLastTextSymbolizer(Rule->TextSymbolizer);
547
		    TextSymbolizer = getLastTextSymbolizer(Rule->TextSymbolizer);
515
 
548
 
Line 540... Line 573...
540
		       TextSymbolizer->halo_radius = att.value(index).toDouble();
573
		       TextSymbolizer->halo_radius = att.value(index).toDouble();
541
 
574
 
542
		    if ((index = att.index(QString("wrap_width"))) != -1)
575
		    if ((index = att.index(QString("wrap_width"))) != -1)
543
		       TextSymbolizer->wrap_width = att.value(index).toDouble();
576
		       TextSymbolizer->wrap_width = att.value(index).toDouble();
544
 
577
 
-
 
578
		    if ((index = att.index(QString("dx"))) != -1)
-
 
579
		       TextSymbolizer->dx = att.value(index).toDouble();
-
 
580
 
545
		    if ((index = att.index(QString("dy"))) != -1)
581
		    if ((index = att.index(QString("dy"))) != -1)
546
		       TextSymbolizer->dy = att.value(index).toDouble();
582
		       TextSymbolizer->dy = att.value(index).toDouble();
547
 
583
 
548
		    if ((index = att.index(QString("max_distance"))) != -1)
584
		    if ((index = att.index(QString("max_distance"))) != -1)
549
		       TextSymbolizer->maxdistance = att.value(index).toDouble();
585
		       TextSymbolizer->maxdistance = att.value(index).toDouble();
550
 
586
 
551
		    if ((index = att.index(QString("min_distance"))) != -1)
587
		    if ((index = att.index(QString("min_distance"))) != -1)
552
		       TextSymbolizer->mindistance = att.value(index).toDouble();
588
		       TextSymbolizer->mindistance = att.value(index).toDouble();
553
cout << "         <Textsymbolizer name=" << TextSymbolizer->name.toAscii().data() << " ... >" << endl;
-
 
554
		 break;
589
		 break;
555
 
590
 
556
		 case CON_POLYGONPATTERNSYMBOLIZER:
591
		 case CON_POLYGONPATTERNSYMBOLIZER:
557
		    Container = in_polygonpatternsymbolizer;
592
		    Container = in_polygonpatternsymbolizer;
558
 
593
 
559
		    if (!Rule)
594
		    if (!Rule)
560
		    {
595
		    {
561
		       KMessageBox::error(0, i18n("Error parsing %1: Open POLYGONPATTERNSYMBOLIZER outside of a RULE!").arg(XmlPath));
596
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open POLYGONPATTERNSYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
562
		       return false;
597
		       return false;
563
		    }
598
		    }
564
 
599
 
565
		    PolygonPatternSymbolizer = getLastPolygonPatternSymbolizer(Rule->PolygonPatternSymbolizer);
600
		    PolygonPatternSymbolizer = getLastPolygonPatternSymbolizer(Rule->PolygonPatternSymbolizer);
566
 
601
 
Line 587... Line 622...
587
		    if ((index = att.index(QString("height"))) != -1)
622
		    if ((index = att.index(QString("height"))) != -1)
588
		       PolygonPatternSymbolizer->height = att.value(index).toDouble();
623
		       PolygonPatternSymbolizer->height = att.value(index).toDouble();
589
 
624
 
590
		    if ((index = att.index(QString("allow_overlap"))) != -1)
625
		    if ((index = att.index(QString("allow_overlap"))) != -1)
591
		       PolygonPatternSymbolizer->allow_overlap = getBool(att.value(index));
626
		       PolygonPatternSymbolizer->allow_overlap = getBool(att.value(index));
592
cout << "         <Polygonpatternsymbolizer file=" << PolygonPatternSymbolizer->file.toAscii().data() << " ... >" << endl;
-
 
593
		 break;
627
		 break;
594
 
628
 
595
		 case CON_SHIELDSYMBOLIZER:
629
		 case CON_SHIELDSYMBOLIZER:
596
		    Container = in_shieldsymbolizer;
630
		    Container = in_shieldsymbolizer;
597
 
631
 
598
		    if (!Rule)
632
		    if (!Rule)
599
		    {
633
		    {
600
		       KMessageBox::error(0, i18n("Error parsing %1: Open SHIELDSYMBOLIZER outside of a RULE!").arg(XmlPath));
634
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open SHIELDSYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
601
		       return false;
635
		       return false;
602
		    }
636
		    }
603
 
637
 
604
		    ShieldSymbolizer = getLastShieldSymbolizer(Rule->ShieldSymbolizer);
638
		    ShieldSymbolizer = getLastShieldSymbolizer(Rule->ShieldSymbolizer);
605
 
639
 
Line 639... Line 673...
639
		       ShieldSymbolizer->width = att.value(index).toDouble();
673
		       ShieldSymbolizer->width = att.value(index).toDouble();
640
 
674
 
641
		    if ((index = att.index(QString("height"))) != -1)
675
		    if ((index = att.index(QString("height"))) != -1)
642
		       ShieldSymbolizer->height = att.value(index).toDouble();
676
		       ShieldSymbolizer->height = att.value(index).toDouble();
643
 
677
 
-
 
678
		    if ((index = att.index(QString("dx"))) != -1)
-
 
679
		       ShieldSymbolizer->dx = att.value(index).toDouble();
-
 
680
 
-
 
681
		    if ((index = att.index(QString("dy"))) != -1)
-
 
682
		       ShieldSymbolizer->dy = att.value(index).toDouble();
-
 
683
 
644
		    if ((index = att.index(QString("min_distance"))) != -1)
684
		    if ((index = att.index(QString("min_distance"))) != -1)
645
		       ShieldSymbolizer->mindistance = att.value(index).toDouble();
685
		       ShieldSymbolizer->mindistance = att.value(index).toDouble();
646
 
686
 
647
		    if ((index = att.index(QString("max_distance"))) != -1)
687
		    if ((index = att.index(QString("max_distance"))) != -1)
648
		       ShieldSymbolizer->maxdistance = att.value(index).toDouble();
688
		       ShieldSymbolizer->maxdistance = att.value(index).toDouble();
649
cout << "         <Shieldsymbolizer name=" << ShieldSymbolizer->name.toAscii().data() << " ... >" << endl;
-
 
650
		 break;
689
		 break;
651
 
690
 
652
		 case CON_LINEPATTERNSYMBOLIZER:
691
		 case CON_LINEPATTERNSYMBOLIZER:
653
		    Container = in_linepatternsymbolizer;
692
		    Container = in_linepatternsymbolizer;
654
 
693
 
655
		    if (!Rule)
694
		    if (!Rule)
656
		    {
695
		    {
657
		       KMessageBox::error(0, i18n("Error parsing %1: Open LINEPATTERNSYMBOLIZER outside of a RULE!").arg(XmlPath));
696
		       KMessageBox::error(0, i18n("Error parsing %1, line %2: Open LINEPATTERNSYMBOLIZER outside of a RULE!").arg(XmlPath).arg(XmlLine));
658
		       return false;
697
		       return false;
659
		    }
698
		    }
660
 
699
 
661
		    LinePatternSymbolizer = getLastLinePatternSymbolizer(Rule->LinePatternSymbolizer);
700
		    LinePatternSymbolizer = getLastLinePatternSymbolizer(Rule->LinePatternSymbolizer);
662
 
701
 
Line 680... Line 719...
680
		    if ((index = att.index(QString("width"))) != -1)
719
		    if ((index = att.index(QString("width"))) != -1)
681
		       LinePatternSymbolizer->width = att.value(index).toDouble();
720
		       LinePatternSymbolizer->width = att.value(index).toDouble();
682
 
721
 
683
		    if ((index = att.index(QString("height"))) != -1)
722
		    if ((index = att.index(QString("height"))) != -1)
684
		       LinePatternSymbolizer->height = att.value(index).toDouble();
723
		       LinePatternSymbolizer->height = att.value(index).toDouble();
685
cout << "         <Linepatternsymbolizer file=" << LinePatternSymbolizer->file.toAscii().data() << " ... >" << endl;
-
 
686
		 break;
724
		 break;
687
	      }
725
	      }
688
	   }
726
	   }
689
 
727
 
690
	   i++;
728
	   i++;
Line 720... Line 758...
720
			  else if (att.value(index).toLower() == QString("stroke-dasharray"))
758
			  else if (att.value(index).toLower() == QString("stroke-dasharray"))
721
			     Names = stroke_dasharray;
759
			     Names = stroke_dasharray;
722
		       }
760
		       }
723
		       else
761
		       else
724
		       {
762
		       {
725
			  KMessageBox::error(0, i18n("Error parsing %1: Required attribute NAME is missing in CSSPARAMETER inside LINESYMBOLIZER!").arg(XmlPath));
763
			  KMessageBox::error(0, i18n("Error parsing %1, line %2: Required attribute NAME is missing in CSSPARAMETER inside LINESYMBOLIZER!").arg(XmlPath).arg(XmlLine));
726
			  return false;
764
			  return false;
727
		       }
765
		       }
728
		    }
766
		    }
729
		 break;
767
		 break;
730
 
768
 
Line 740... Line 778...
740
			  else if (att.value(index).toLower() == QString("fill-opacity"))
778
			  else if (att.value(index).toLower() == QString("fill-opacity"))
741
			     Names = fill_opacity;
779
			     Names = fill_opacity;
742
		       }
780
		       }
743
		       else
781
		       else
744
		       {
782
		       {
745
			  KMessageBox::error(0, i18n("Error parsing %1: Required attribute NAME is missing in CSSPARAMETER inside POLYGONSYMBOLIZER!").arg(XmlPath));
783
			  KMessageBox::error(0, i18n("Error parsing %1, line %2: Required attribute NAME is missing in CSSPARAMETER inside POLYGONSYMBOLIZER!").arg(XmlPath).arg(XmlLine));
746
			  return false;
784
			  return false;
747
		       }
785
		       }
748
		    }
786
		    }
749
		 break;
787
		 break;
750
 
788
 
Line 772... Line 810...
772
			  else if (att.value(index).toLower() == QString("extent"))
810
			  else if (att.value(index).toLower() == QString("extent"))
773
			     Names = extent;
811
			     Names = extent;
774
		       }
812
		       }
775
		       else
813
		       else
776
		       {
814
		       {
777
			  KMessageBox::error(0, i18n("Error parsing %1: Required attribute NAME is missing in PARAMETER inside DATASOURCE!").arg(XmlPath));
815
			  KMessageBox::error(0, i18n("Error parsing %1, line %2: Required attribute NAME is missing in PARAMETER inside DATASOURCE!").arg(XmlPath).arg(XmlLine));
778
			  return false;
816
			  return false;
779
		       }
817
		       }
780
		    }
818
		    }
781
		 break;
819
		 break;
782
 
820
 
Line 849... Line 887...
849
	      p["estimate_extent"] = (Lay->Datasource.estimate_extent) ? "true" : "false";
887
	      p["estimate_extent"] = (Lay->Datasource.estimate_extent) ? "true" : "false";
850
	      p["extent"] = QString("%1,%2,%3,%4").arg(Lay->Datasource.ext_lx).arg(Lay->Datasource.ext_ly).arg(Lay->Datasource.ext_rx).arg(Lay->Datasource.ext_ry).toAscii().data();
888
	      p["extent"] = QString("%1,%2,%3,%4").arg(Lay->Datasource.ext_lx).arg(Lay->Datasource.ext_ly).arg(Lay->Datasource.ext_rx).arg(Lay->Datasource.ext_ry).toAscii().data();
851
	   }
889
	   }
852
	   else
890
	   else
853
	   {
891
	   {
854
	      cerr << "Warning: Layer with no source! Ingnoring!" << endl;
892
	      cerr << "Warning file " << XmlPath.toAscii().data() << ", line " << XmlLine << ": Layer with no source! Ingnoring!" << endl;
855
	      return true;
893
	      return true;
856
	   }
894
	   }
857
 
895
 
858
	   Layer lyr(Lay->name.toAscii().data());
896
	   Layer lyr(Lay->name.toAscii().data());
-
 
897
	   lyr.set_title(Lay->name.toAscii().data());
859
	   lyr.set_datasource(datasource_cache::instance()->create(p));
898
	   lyr.set_datasource(datasource_cache::instance()->create(p));
-
 
899
 
-
 
900
	   if (Lay->minzoom > 0.0)
860
	   lyr.setActive(Lay->status);
901
	      lyr.setMinZoom(Lay->minzoom);
-
 
902
 
-
 
903
	   if (Lay->maxzoom > 0.0)
-
 
904
	      lyr.setMaxZoom(Lay->maxzoom);
861
 
905
 
862
	   if (!Lay->srs.isEmpty())
906
	   if (!Lay->srs.isEmpty())
863
	      lyr.set_srs(Lay->srs.toAscii().constData());
907
	      lyr.set_srs(Lay->srs.toAscii().constData());
864
 
908
 
865
	   // Add the styles
909
	   // Add the styles
866
	   for (int i = 0; i < Lay->Styles.size(); i++)
910
	   for (int i = 0; i < Lay->Styles.size(); i++)
-
 
911
	   {
-
 
912
	      if (findStyle (Lay->Styles.at(i)) != 0)
867
	      lyr.add_style(Lay->Styles.at(i).toAscii().constData());
913
		 lyr.add_style(Lay->Styles.at(i).toAscii().constData());
-
 
914
	      else
-
 
915
		 cerr << "Warning file " << XmlPath.toAscii().data() << ", line " << XmlLine << ": Style \"" << Lay->Styles.at(i).toAscii().data() << "\" does not exist!" << endl;
-
 
916
	   }
868
 
917
 
-
 
918
	   lyr.setActive(Lay->status);
869
	   m.addLayer(lyr);
919
	   m.addLayer(lyr);
-
 
920
	   Envelope <double>le(lyr.envelope());
-
 
921
	   setMaxExtent(le.minx(), le.miny(), le.maxx(), le.maxy());
870
	}
922
	}
871
	else if (qName.toLower() == QString("map"))
923
	else if (qName.toLower() == QString("map"))
872
	{
924
	{
873
	color col;
-
 
874
 
-
 
875
	   Container = in_root;
925
	   Container = in_root;
876
	   col.set_bgr(MapPars.bgcolor);
-
 
877
	   m.set_background(col);
-
 
878
	   m.set_buffer_size(MapPars.buf_size);
-
 
879
	   ControlSet = true;
926
	   ControlSet = true;
880
	}
927
	}
881
	else if (qName.toLower() == QString("pointsymbol") ||
928
	else if (qName.toLower() == QString("pointsymbolizer"))
882
		 qName.toLower() == QString("linesymbol") ||
-
 
883
		 qName.toLower() == QString("polygonsymbol") ||
-
 
884
		 qName.toLower() == QString("textsymbol") ||
-
 
885
		 qName.toLower() == QString("polygonpatternsymbol") ||
-
 
886
		 qName.toLower() == QString("shieldsymbol") ||
-
 
887
		 qName.toLower() == QString("linepatternsymbol") ||
-
 
888
		 qName.toLower() == QString("filter") ||
-
 
889
		 qName.toLower() == QString("maxscaledenominator") ||
-
 
890
		 qName.toLower() == QString("minscaledenominator"))
-
 
-
 
929
	{
891
	   Container = in_rule;
930
	   Container = in_rule;
-
 
931
 
892
	else if (qName.toLower() == QString("rule"))
932
	   if (!Rule || !PointSymbolizer)
-
 
933
	   {
-
 
934
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Ending of POINTSYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
893
	   Container = in_style;
935
	      return false;
-
 
936
	   }
-
 
937
 
-
 
938
	   if (PointSymbolizer->file.length() == 0 || PointSymbolizer->width == 0 || PointSymbolizer->height == 0)
-
 
939
	   {
-
 
940
	      cerr << "Warning file " << XmlPath.toAscii().data() << ", line " << XmlLine << ": Empty POINTSYMBOLIZER!" << endl;
-
 
941
	      point_symbolizer psym;
-
 
942
	      Rule->rl.append(psym);
-
 
943
	   }
-
 
944
	   else
-
 
945
	   {
-
 
946
	      point_symbolizer ps(PointSymbolizer->file.toAscii().data(), getTypeText(PointSymbolizer->type), PointSymbolizer->width, PointSymbolizer->height);
-
 
947
	      ps.set_allow_overlap (PointSymbolizer->allow_overlap);
-
 
948
	      Rule->rl.append(ps);
-
 
949
	   }
-
 
950
	}
894
	else if (qName.toLower() == QString("style"))
951
	else if (qName.toLower() == QString("linesymbolizer"))
895
	{
952
	{
896
	   Container = in_map;
953
	   Container = in_rule;
897
	   feature_type_style style;
-
 
898
 
954
 
899
	   if (Style->rule)
955
	   if (!Rule || !LineSymbolizer)
900
	   {
956
	   {
-
 
957
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Ending of LINESYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
901
	      rule_type rule;
958
	      return false;
902
	      Rule = Style->rule;
959
	   }
903
 
960
 
904
	      while (Rule)
961
	   stroke st;
905
	      {
962
	   color col;
906
		 if (Rule->minscale >= 0.0)
-
 
907
		    rule.set_min_scale(Rule->minscale);
963
	   col.set_bgr(LineSymbolizer->stroke);
908
 
964
 
909
		 if (Rule->maxscale >= 0.0)
-
 
910
		    rule.set_max_scale(Rule->maxscale);
965
	   st.set_color (col);
911
 
966
 
912
		 if (!Rule->filter.isEmpty())
967
	   if (LineSymbolizer->stroke_width != 0.0)
913
		    rule.set_filter(create_filter(Rule->filter.toAscii().data()));
968
	      st.set_width (LineSymbolizer->stroke_width);
914
 
969
 
915
		 LineSymbolizer = Rule->LineSymbolizer;
970
	   if (!LineSymbolizer->stroke_linejoin.isEmpty())
-
 
971
	   {
-
 
972
	      if (LineSymbolizer->stroke_linejoin.toLower() == QString("miter"))
-
 
973
		 st.set_line_join (mapnik::MITER_JOIN);
-
 
974
	      else if (LineSymbolizer->stroke_linejoin.toLower() == QString("miter_revert") ||
-
 
975
			 LineSymbolizer->stroke_linejoin.toLower() == QString("miter-revert"))
-
 
976
		 st.set_line_join (mapnik::MITER_REVERT_JOIN);
-
 
977
	      else if (LineSymbolizer->stroke_linejoin.toLower() == QString("round"))
-
 
978
		 st.set_line_join (mapnik::ROUND_JOIN);
-
 
979
	      else if (LineSymbolizer->stroke_linejoin.toLower() == QString("bevel"))
-
 
980
		 st.set_line_join (mapnik::BEVEL_JOIN);
-
 
981
	      else
-
 
982
		 cerr << "Error parsing " << XmlPath.toAscii().data() << ", line " << XmlLine << ": Unknown >>line_join<< \"" << LineSymbolizer->stroke_linejoin.toAscii().data() << "\" --> ignoring!" << endl;
-
 
983
	   }
916
 
984
 
917
		 while (LineSymbolizer)
985
	   if (!LineSymbolizer->stroke_linecap.isEmpty())
918
		 {
986
	   {
-
 
987
	      if (LineSymbolizer->stroke_linecap.toLower() == QString("butt"))
919
		    stroke st;
988
		st.set_line_cap (mapnik::BUTT_CAP);
-
 
989
	      else if (LineSymbolizer->stroke_linecap.toLower() == QString("square"))
920
		    color col;
990
		st.set_line_cap (mapnik::SQUARE_CAP);
-
 
991
	      else if (LineSymbolizer->stroke_linecap.toLower() == QString("round"))
921
		    col.set_bgr(LineSymbolizer->stroke);
992
		st.set_line_cap (mapnik::ROUND_CAP);
-
 
993
	      else
-
 
994
		 cerr << "Error parsing " << XmlPath.toAscii().data() << ", line " << XmlLine << ": Unknown >>line_cap<< \"" << LineSymbolizer->stroke_linecap.toAscii().data() << "\" --> ignoring!" << endl;
-
 
995
	   }
922
 
996
 
923
		    st.set_color (col);
997
	   if (LineSymbolizer->stroke_dasharray[0] > 0 || LineSymbolizer->stroke_dasharray[1] > 0)
924
		    st.set_width (LineSymbolizer->stroke_width);
998
	      st.add_dash(LineSymbolizer->stroke_dasharray[0], LineSymbolizer->stroke_dasharray[1]);
925
 
999
 
926
		    if (!LineSymbolizer->stroke_linejoin.isEmpty())
1000
	   if (LineSymbolizer->stroke_opacity != 0)
927
		    {
-
 
928
		       if (LineSymbolizer->stroke_linejoin.toLower() == QString("miter"))
-
 
929
			   st.set_line_join (mapnik::MITER_JOIN);
-
 
930
		       else if (LineSymbolizer->stroke_linejoin.toLower() == QString("miter_revert") ||
-
 
931
			        LineSymbolizer->stroke_linejoin.toLower() == QString("miter-revert"))
-
 
932
			   st.set_line_join (mapnik::MITER_REVERT_JOIN);
-
 
933
		       else if (LineSymbolizer->stroke_linejoin.toLower() == QString("round"))
-
 
934
			   st.set_line_join (mapnik::ROUND_JOIN);
-
 
935
		       else if (LineSymbolizer->stroke_linejoin.toLower() == QString("bevel"))
-
 
936
			   st.set_line_join (mapnik::BEVEL_JOIN);
-
 
937
		       else
-
 
938
		       {
-
 
939
			   cerr << "Error parsing " << XmlPath.toAscii().data() << ": Unknown >>line_join<< \"" << LineSymbolizer->stroke_linejoin.toAscii().data() << "\" --> ignoring!" << endl;
-
 
940
			   LineSymbolizer = LineSymbolizer->next;
1001
	      st.set_opacity(LineSymbolizer->stroke_opacity);
941
			   continue;
-
 
942
		       }
-
 
943
		    }
-
 
944
 
1002
 
945
		    if (!LineSymbolizer->stroke_linecap.isEmpty())
1003
	   Rule->rl.append(line_symbolizer(st));
946
		    {
1004
	}
947
		       if (LineSymbolizer->stroke_linecap.toLower() == QString("butt"))
-
 
948
			  st.set_line_cap (mapnik::BUTT_CAP);
-
 
949
		       else if (LineSymbolizer->stroke_linecap.toLower() == QString("square"))
1005
	else if (qName.toLower() == QString("polygonsymbolizer"))
950
			  st.set_line_cap (mapnik::SQUARE_CAP);
-
 
951
		       else if (LineSymbolizer->stroke_linecap.toLower() == QString("round"))
-
 
952
			  st.set_line_cap (mapnik::ROUND_CAP);
-
 
953
		       else
-
 
954
		       {
1006
	{
955
			   cerr << "Error parsing " << XmlPath.toAscii().data() << ": Unknown >>line_cap<< \"" << LineSymbolizer->stroke_linecap.toAscii().data() << "\" --> ignoring!" << endl;
-
 
956
			   LineSymbolizer = LineSymbolizer->next;
-
 
957
			   continue;
1007
	   Container = in_rule;
958
		       }
-
 
959
		    }
-
 
960
 
1008
 
961
		    st.add_dash(LineSymbolizer->stroke_dasharray[0], LineSymbolizer->stroke_dasharray[1]);
-
 
962
		    st.set_opacity(LineSymbolizer->stroke_opacity);
1009
	   if (!Rule || !PolygonSymbolizer)
-
 
1010
	   {
963
		    rule.append(line_symbolizer(st));
1011
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Ending of POLYGONSYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
964
		    LineSymbolizer = LineSymbolizer->next;
1012
	      return false;
965
		 }
1013
	   }
966
 
1014
 
-
 
1015
	   color col;
967
		 PointSymbolizer = Rule->PointSymbolizer;
1016
	   col.set_bgr(PolygonSymbolizer->fill);
968
 
1017
 
969
		 while (PointSymbolizer)
1018
	   polygon_symbolizer ps(col);
970
		 {
-
 
971
		    if (PointSymbolizer->file.length() == 0 || PointSymbolizer->width == 0 || PointSymbolizer->height == 0)
-
 
972
		    {
-
 
973
		       cerr << "Warning parsing " << XmlPath.toAscii().data() << ": Ignoring empty POINTSYMBOLIZER!" << endl;
-
 
974
		       break;
-
 
975
		    }
-
 
976
 
1019
 
977
		    point_symbolizer ps(PointSymbolizer->file.toAscii().data(), getTypeText(PointSymbolizer->type), PointSymbolizer->width, PointSymbolizer->height);
-
 
978
		    ps.set_allow_overlap (PointSymbolizer->allow_overlap);
1020
	   if (PolygonSymbolizer->fill_opacity > 0.0)
979
		    rule.append(ps);
-
 
980
		    PointSymbolizer = PointSymbolizer->next;
1021
	      ps.set_opacity(PolygonSymbolizer->fill_opacity);
981
		 }
-
 
982
 
1022
 
-
 
1023
	   Rule->rl.append(ps);
-
 
1024
	}
983
		 PolygonSymbolizer = Rule->PolygonSymbolizer;
1025
	else if (qName.toLower() == QString("textsymbolizer"))
-
 
1026
	{
-
 
1027
	   Container = in_rule;
984
 
1028
 
985
		 while (PolygonSymbolizer)
1029
	   if (!Rule || !TextSymbolizer)
986
		 {
1030
	   {
-
 
1031
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Ending of TEXTSYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
987
		    color col;
1032
	      return false;
988
		    col.set_bgr(PolygonSymbolizer->fill);
1033
	   }
989
 
1034
 
990
		    polygon_symbolizer ps(col);
1035
	   color col;
991
		    ps.set_opacity(PolygonSymbolizer->fill_opacity);
1036
	   col.set_bgr(TextSymbolizer->fill);
992
		    rule.append(ps);
-
 
993
		    PolygonSymbolizer = PolygonSymbolizer->next;
-
 
994
		 }
-
 
995
 
1037
 
996
		 TextSymbolizer = Rule->TextSymbolizer;
1038
	   text_symbolizer ts(TextSymbolizer->name.toAscii().data(), TextSymbolizer->face_name.toAscii().data(), TextSymbolizer->size, col);
997
 
1039
 
998
		 while (TextSymbolizer)
1040
	   if (TextSymbolizer->halo_radius != 0.0)
999
		 {
-
 
1000
		    color col;
-
 
1001
		    col.set_bgr(TextSymbolizer->fill);
1041
	      ts.set_halo_radius((unsigned int)TextSymbolizer->halo_radius);
1002
 
1042
 
1003
		    text_symbolizer ts(TextSymbolizer->name.toAscii().data(), TextSymbolizer->face_name.toAscii().data(), TextSymbolizer->size, col);
-
 
1004
		    ts.set_halo_radius((unsigned int)TextSymbolizer->halo_radius);
1043
	   if (TextSymbolizer->wrap_width != 0.0)
1005
		    ts.set_wrap_width((unsigned int)TextSymbolizer->wrap_width);
1044
	      ts.set_wrap_width((unsigned int)TextSymbolizer->wrap_width);
1006
		    ts.set_max_char_angle_delta(TextSymbolizer->dy);
-
 
1007
		    ts.set_displacement(TextSymbolizer->mindistance, TextSymbolizer->maxdistance);
-
 
1008
		    rule.append(ts);
-
 
1009
		    TextSymbolizer = TextSymbolizer->next;
-
 
1010
		 }
-
 
1011
 
1045
 
1012
		 PolygonPatternSymbolizer = Rule->PolygonPatternSymbolizer;
1046
	   if (TextSymbolizer->mindistance != 0)
-
 
1047
	      ts.set_label_spacing(TextSymbolizer->mindistance);
1013
 
1048
 
1014
		 while (PolygonPatternSymbolizer)
-
 
1015
		 {
-
 
1016
		    // FIXME: The file name must be variable and KDE like!!
1049
	   if (TextSymbolizer->dx != 0 || TextSymbolizer->dy != 0)
1017
		    rule.append(polygon_pattern_symbolizer(PolygonPatternSymbolizer->file.toAscii().data(),
-
 
1018
							getTypeText(PolygonPatternSymbolizer->type),
1050
	      ts.set_displacement(TextSymbolizer->dx, TextSymbolizer->dy);
1019
							PolygonPatternSymbolizer->width,
-
 
-
 
1051
 
1020
							PolygonPatternSymbolizer->height));
1052
	   Rule->rl.append(ts);
-
 
1053
	}
1021
		    PolygonPatternSymbolizer = PolygonPatternSymbolizer->next;
1054
	else if (qName.toLower() == QString("polygonpatternsymbolizer"))
1022
		 }
1055
	{
-
 
1056
	   Container = in_rule;
1023
 
1057
 
1024
		 ShieldSymbolizer = Rule->ShieldSymbolizer;
1058
	   if (!Rule || !PolygonPatternSymbolizer)
-
 
1059
	   {
-
 
1060
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Endin of POLYGONPATTERNSYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
-
 
1061
	      return false;
-
 
1062
	   }
1025
 
1063
 
1026
		 while (ShieldSymbolizer)
-
 
1027
		 {
-
 
1028
		    color col;
-
 
1029
		    col.set_bgr(ShieldSymbolizer->fill);
-
 
1030
		    // FIXME: The file name must be variable and KDE like!!
-
 
1031
		    shield_symbolizer ss(ShieldSymbolizer->name.toAscii().data(),
1064
	   Rule->rl.append(polygon_pattern_symbolizer(findIcon(PolygonPatternSymbolizer->file).toAscii().data(),
1032
					ShieldSymbolizer->face_name.toAscii().data(),
-
 
1033
					ShieldSymbolizer->size, col,
1065
						getTypeText(PolygonPatternSymbolizer->type),
1034
					ShieldSymbolizer->file.toAscii().data(),
-
 
1035
					getTypeText(ShieldSymbolizer->type),
1066
						PolygonPatternSymbolizer->width,
1036
					ShieldSymbolizer->width, ShieldSymbolizer->height);
1067
						PolygonPatternSymbolizer->height));
1037
		    ss.set_label_placement((ShieldSymbolizer->placement.toLower() == QString("point")) ? mapnik::POINT_PLACEMENT : mapnik::LINE_PLACEMENT);
-
 
1038
		    ss.set_displacement(ShieldSymbolizer->mindistance, ShieldSymbolizer->maxdistance);
1068
	   PolygonPatternSymbolizer = PolygonPatternSymbolizer->next;
1039
		    rule.append(ss);
1069
	}
1040
		    ShieldSymbolizer = ShieldSymbolizer->next;
1070
	else if (qName.toLower() == QString("shieldsymbolizer"))
1041
		 }
1071
	{
-
 
1072
	   Container = in_rule;
1042
 
1073
 
1043
		 LinePatternSymbolizer = Rule->LinePatternSymbolizer;
1074
	   if (!Rule || !ShieldSymbolizer)
-
 
1075
	   {
-
 
1076
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Ending of SHIELDSYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
-
 
1077
	      return false;
-
 
1078
	   }
1044
 
1079
 
-
 
1080
	   color col;
1045
		 while (LinePatternSymbolizer)
1081
	   col.set_bgr(ShieldSymbolizer->fill);
1046
		 {
-
 
1047
		    // FIXME: The file name must be variable and KDE like!!
1082
	   shield_symbolizer ss(ShieldSymbolizer->name.toAscii().data(),
1048
		    rule.append(line_pattern_symbolizer(LinePatternSymbolizer->file.toAscii().data(),
1083
				ShieldSymbolizer->face_name.toAscii().data(),
1049
							getTypeText(LinePatternSymbolizer->type),
1084
				ShieldSymbolizer->size, col,
-
 
1085
				findIcon(ShieldSymbolizer->file).toAscii().data(),
1050
							LinePatternSymbolizer->width,
1086
				getTypeText(ShieldSymbolizer->type),
1051
							LinePatternSymbolizer->height));
1087
				ShieldSymbolizer->width, ShieldSymbolizer->height);
-
 
1088
 
1052
		    LinePatternSymbolizer = LinePatternSymbolizer->next;
1089
	   if (!ShieldSymbolizer->placement.isEmpty())
-
 
1090
	      ss.set_label_placement((ShieldSymbolizer->placement.toLower() == QString("point")) ? mapnik::POINT_PLACEMENT : mapnik::LINE_PLACEMENT);
1053
		 }
1091
 
-
 
1092
	   if (ShieldSymbolizer->dx != 0 || ShieldSymbolizer->dy != 0)
-
 
1093
	      ss.set_displacement(ShieldSymbolizer->dx, ShieldSymbolizer->dy);
1054
 
1094
 
-
 
1095
	   if (ShieldSymbolizer->mindistance != 0)
-
 
1096
	      ss.set_label_spacing(ShieldSymbolizer->mindistance);
-
 
1097
 
-
 
1098
	   Rule->rl.append(ss);
-
 
1099
	}
-
 
1100
	else if (qName.toLower() == QString("linepatternsymbolizer"))
-
 
1101
	{
-
 
1102
	   Container = in_rule;
-
 
1103
 
-
 
1104
	   if (!Rule || !LinePatternSymbolizer)
-
 
1105
	   {
-
 
1106
	      KMessageBox::error(0, i18n("Error parsing %1, line %2: Ending of LINEPATTERNSYMBOLIZER without start, or outside of a RULE detected!").arg(XmlPath).arg(XmlLine));
-
 
1107
	      return false;
-
 
1108
	   }
-
 
1109
 
-
 
1110
	   Rule->rl.append(line_pattern_symbolizer(findIcon(LinePatternSymbolizer->file).toAscii().data(),
-
 
1111
						getTypeText(LinePatternSymbolizer->type),
-
 
1112
						LinePatternSymbolizer->width,
-
 
1113
						LinePatternSymbolizer->height));
-
 
1114
	}
-
 
1115
	else if (qName.toLower() == QString("filter") ||
-
 
1116
		 qName.toLower() == QString("maxscaledenominator") ||
-
 
1117
		 qName.toLower() == QString("minscaledenominator"))
-
 
1118
	   Container = in_rule;
-
 
1119
	else if (qName.toLower() == QString("rule"))
-
 
1120
	   Container = in_style;
-
 
1121
	else if (qName.toLower() == QString("style"))
-
 
1122
	{
-
 
1123
	   Container = in_map;
-
 
1124
	   feature_type_style style;
-
 
1125
 
-
 
1126
	   if (Style->rule)
-
 
1127
	   {
-
 
1128
	      Rule = Style->rule;
-
 
1129
 
-
 
1130
	      while (Rule)
-
 
1131
	      {
1055
		 style.add_rule(rule);
1132
		 style.add_rule(Rule->rl);
1056
		 Rule = Rule->next;
1133
		 Rule = Rule->next;
1057
	      }
1134
	      }
1058
	   }
1135
	   }
1059
 
1136
 
1060
	   // Add style to map
1137
	   // Add style to map
Line 1066... Line 1143...
1066
 
1143
 
1067
/*
1144
/*
1068
 * The reader calls this function when it has parsed a chunk of character data
1145
 * The reader calls this function when it has parsed a chunk of character data
1069
 * - either normal character data or character data inside a CDATA section.
1146
 * - either normal character data or character data inside a CDATA section.
1070
 */
1147
 */
1071
bool SRender::characters (const QString& ch)
1148
bool SRender::characters (const QString& chraw)
1072
{
1149
{
-
 
1150
	QString ch = chraw.trimmed();
-
 
1151
 
-
 
1152
	if (ch.length() == 0)
-
 
1153
	   return true;
-
 
1154
 
1073
	if (ch.length() == 0 || ch.at(0) == QChar('\n'))
1155
	if (ch.at(0) == QChar('\n'))
-
 
1156
	{
-
 
1157
	   XmlLine++;
1074
	   return true;
1158
	   return true;
-
 
1159
	}
1075
 
1160
 
1076
	if (Container == in_rule && Rule)
1161
	if (Container == in_rule && Rule)
1077
	{
1162
	{
1078
	   if (Field == FLD_FILTER)
1163
	   if (Field == FLD_FILTER)
-
 
1164
	   {
1079
	      Rule->filter = ch;
1165
	      Rule->filter = ch;
-
 
1166
 
-
 
1167
	      if (!Rule->filter.isEmpty())
-
 
1168
		 Rule->rl.set_filter(create_filter(Rule->filter.toAscii().data()));
-
 
1169
	      else
-
 
1170
		 cerr << "Warning in file " << XmlPath.toAscii().data() << " at line " << XmlLine << ": Ignoring empty filter!" << endl;
-
 
1171
	   }
1080
	   else if (Field == FLD_MAXSCALE)
1172
	   else if (Field == FLD_MAXSCALE)
-
 
1173
	   {
1081
	      Rule->maxscale = ch.toDouble();
1174
	      Rule->maxscale = ch.toDouble();
-
 
1175
	      Rule->rl.set_max_scale(Rule->maxscale);
-
 
1176
	   }
1082
	   else if (Field == FLD_MINSCALE)
1177
	   else if (Field == FLD_MINSCALE)
-
 
1178
	   {
1083
	      Rule->minscale = ch.toDouble();
1179
	      Rule->minscale = ch.toDouble();
-
 
1180
	      Rule->rl.set_min_scale(Rule->minscale);
-
 
1181
	   }
1084
	}
1182
	}
1085
	else if (Container == in_linesymbolizer && LineSymbolizer)
1183
	else if (Container == in_linesymbolizer && LineSymbolizer)
1086
	{
1184
	{
1087
	   if (Field == FLD_CSSPARAMETER)
1185
	   if (Field == FLD_CSSPARAMETER)
1088
	   {
1186
	   {
Line 1103... Line 1201...
1103
	      QStringList list;
1201
	      QStringList list;
1104
 
1202
 
1105
		 list = arr.split(",", QString::SkipEmptyParts);
1203
		 list = arr.split(",", QString::SkipEmptyParts);
1106
 
1204
 
1107
		 for (pos = 0; pos < list.size() && pos < 10; pos++)
1205
		 for (pos = 0; pos < list.size() && pos < 10; pos++)
1108
		 {
-
 
1109
		    LineSymbolizer->stroke_dasharray[pos] = list.at(pos).toDouble();
1206
		    LineSymbolizer->stroke_dasharray[pos] = list.at(pos).toDouble();
1110
		    pos++;
-
 
1111
		 }
-
 
1112
 
1207
 
1113
		 LineSymbolizer->stroke_anz = pos;
1208
		 LineSymbolizer->stroke_anz = pos;
1114
	      }
1209
	      }
1115
	   }
1210
	   }
1116
	}
1211
	}
Line 1134... Line 1229...
1134
	   if (Field == FLD_PARAMETER)
1229
	   if (Field == FLD_PARAMETER)
1135
	   {
1230
	   {
1136
	      if (Names == type)
1231
	      if (Names == type)
1137
		 Lay->Datasource.type = ch;
1232
		 Lay->Datasource.type = ch;
1138
	      else if (Names == file)
1233
	      else if (Names == file)
-
 
1234
	      {
-
 
1235
	      QFileInfo qf(ch);
-
 
1236
	      QString hv0;
-
 
1237
 
-
 
1238
		 hv0 = shapePath;
-
 
1239
 
-
 
1240
		 if (hv0.right(1) != QString("/"))
-
 
1241
		    hv0 += "/";
-
 
1242
 
-
 
1243
		 hv0 += qf.fileName();
-
 
1244
		 qf.setFile (hv0 + ".shp");
-
 
1245
 
-
 
1246
		 if (!qf.exists())
-
 
1247
		 {
-
 
1248
		    KMessageBox::error(0, i18n("The shape file \"%1\" at line %2 does not exist!").arg(hv0+".shp").arg(XmlLine));
-
 
1249
		    return false;
-
 
1250
		 }
-
 
1251
 
1139
		 Lay->Datasource.file = ch;
1252
		 Lay->Datasource.file = hv0;
-
 
1253
	      }
1140
	      else if (Names == host)
1254
	      else if (Names == host)
1141
		 Lay->Datasource.host = ch;
1255
		 Lay->Datasource.host = ch;
1142
	      else if (Names == user)
1256
	      else if (Names == user)
1143
		 Lay->Datasource.user = ch;
1257
		 Lay->Datasource.user = ch;
1144
	      else if (Names == dbname)
1258
	      else if (Names == dbname)
Line 1150... Line 1264...
1150
	      else if (Names == extent)
1264
	      else if (Names == extent)
1151
	      {
1265
	      {
1152
		 QString arr = ch;
1266
		 QString arr = ch;
1153
		 QStringList list;
1267
		 QStringList list;
1154
		 list = arr.split(",");
1268
		 list = arr.split(",");
-
 
1269
 
-
 
1270
		 if (list.size() >= 1)
1155
		 Lay->Datasource.ext_lx = list.at(0).toDouble();
1271
		    Lay->Datasource.ext_lx = list.at(0).toDouble();
-
 
1272
 
-
 
1273
		 if (list.size() >= 2)
1156
		 Lay->Datasource.ext_ly = list.at(1).toDouble();
1274
		    Lay->Datasource.ext_ly = list.at(1).toDouble();
-
 
1275
 
-
 
1276
		 if (list.size() >= 3)
1157
		 Lay->Datasource.ext_rx = list.at(2).toDouble();
1277
		    Lay->Datasource.ext_rx = list.at(2).toDouble();
-
 
1278
 
-
 
1279
		 if (list.size() >= 4)
1158
		 Lay->Datasource.ext_ry = list.at(3).toDouble();
1280
		    Lay->Datasource.ext_ry = list.at(3).toDouble();
1159
	      }
1281
	      }
1160
	   }
1282
	   }
1161
	}
1283
	}
1162
 
1284
 
1163
	return true;
1285
	return true;
Line 1227... Line 1349...
1227
	return false;
1349
	return false;
1228
}
1350
}
1229
 
1351
 
1230
bool SRender::getMap (double lx, double ly, double rx, double ry)
1352
bool SRender::getMap (double lx, double ly, double rx, double ry)
1231
{
1353
{
1232
int width, height, pid;
1354
int width, height;
1233
QXmlSimpleReader reader;
1355
QXmlSimpleReader reader;
1234
QString hv0;
1356
QString hv0;
1235
QFile file(XmlPath);
1357
QFile file(XmlPath);
-
 
1358
double plx, ply, prx, pry;
-
 
1359
 
-
 
1360
	OutBuf.clear();
-
 
1361
	hv0 = pluginPath;
-
 
1362
 
-
 
1363
	if (hv0.right(1) != QString("/"))
-
 
1364
	   hv0 += "/";
1236
 
1365
 
1237
	hv0 = pluginPath + "/";
-
 
1238
	datasource_cache::instance()->register_datasources(hv0.toAscii().data());
1366
	datasource_cache::instance()->register_datasources(hv0.toAscii().data());
-
 
1367
	hv0 = fontPath;
-
 
1368
 
-
 
1369
	if (hv0.right(1) != QString("/"))
-
 
1370
	   hv0 += "/";
-
 
1371
 
1239
	hv0 = fontPath + "/DejaVuSans.ttf";
1372
	hv0 += "DejaVuSans.ttf";
1240
	freetype_engine::register_font(hv0.toAscii().data());
1373
	freetype_engine::register_font(hv0.toAscii().data());
1241
 
1374
 
1242
	width = label->width();
1375
	width = label->width();
1243
	height = label->height();
1376
	height = label->height();
1244
 
1377
 
1245
	m.setWidth(width);
1378
	m.setWidth(width);
1246
	m.setHeight(height);
1379
	m.setHeight(height);
-
 
1380
//	load_map(m, XmlPath.toAscii().data());
1247
 
1381
 
1248
	if (!ControlSet)	// Initialize the map?
1382
	if (!ControlSet)	// Initialize the map?
1249
	{
1383
	{
1250
	   QXmlInputSource source (&file);
1384
	   QXmlInputSource source (&file);
1251
	   reader.setContentHandler (this);
1385
	   reader.setContentHandler (this);
1252
	   reader.parse (source);
1386
	   reader.parse (source);
1253
	}
1387
	}
1254
 
1388
 
-
 
1389
	save_map(m, "/home/andreas/.sportwatcher/spw.xml");
-
 
1390
//	save_map(m, "/home/andreas/.sportwatcher/spw1.xml");
-
 
1391
	plx = lx;
-
 
1392
	ply = ly;
-
 
1393
	prx = rx;
-
 
1394
	pry = ry;
-
 
1395
	projection pj(m.srs());
-
 
1396
 
-
 
1397
	if (pj.is_geographic())
-
 
1398
	{
-
 
1399
	   pj.inverse(plx, ply);
-
 
1400
	   pj.inverse(prx, pry);
-
 
1401
cout << "Geographic! Inverse projection." << endl;
-
 
1402
	}
-
 
1403
	else
-
 
1404
	{
-
 
1405
//	   pj.forward(plx, ply);
-
 
1406
//	   pj.forward(prx, pry);
-
 
1407
cout << "NOT geographic!" << endl;
-
 
1408
	}
-
 
1409
 
-
 
1410
for (unsigned i = 0; i < m.layerCount(); i++)
-
 
1411
{
-
 
1412
   bool vis = m.getLayer(i).isVisible(m.scale_denominator());
-
 
1413
   cout << "Layer " << i << ": " << m.getLayer(i).name();
-
 
1414
   cout << ", Visible: " << vis;
-
 
1415
   Envelope <double>e(m.getLayer(i).envelope());
-
 
1416
   cout << ", Extent: " << e.minx() << ", " << e.miny() << ", " << e.maxx() << ", " << e.maxy() << endl;
-
 
1417
}
-
 
1418
 
1255
	// First we use Mapnik to create the map
1419
	// First we use Mapnik to create the map
-
 
1420
	m.zoomToBox(Envelope<double>(plx, ply, prx, pry));
-
 
1421
 
-
 
1422
Envelope <double>e(m.getCurrentExtent());
1256
cout << lx << ", " << ly << ", " << rx << ", " << ry << endl;
1423
cout << std::setprecision(16) << "Parameter envelope: " << lx << ", " << ly << ", " << rx << ", " << ry << endl;
1257
//cout << DEG2RAD(lx) << ", " << DEG2RAD(ly) << ", " << DEG2RAD(rx) << ", " << DEG2RAD(ry) << endl;
1424
cout << std::setprecision(16) << "Converted envelope: " << plx << ", " << ply << ", " << prx << ", " << pry << endl;
-
 
1425
cout << std::setprecision(16) << "Current extent:     " << e.minx() << ", " << e.miny() << ", " << e.maxx() << ", " << e.maxy() << endl;
1258
	m.zoomToBox(Envelope<double>(lx, ly, rx, ry));
1426
cout << "SRS: " << m.srs() << endl;
-
 
1427
cout << std::setprecision(16) << "Scale: " << m.scale() << ", scale denominator: " << m.scale_denominator() << endl;
-
 
1428
cout << "width=" << m.getWidth() << ", height=" << m.getHeight() << endl;
-
 
1429
 
1259
	Image32 buf(m.getWidth(), m.getHeight());
1430
	Image32 buf(m.getWidth(), m.getHeight());
1260
	agg_renderer<Image32> ren(m, buf);
1431
	agg_renderer<Image32> ren(m, buf);
1261
	ren.apply();
1432
	ren.apply();
-
 
1433
	// Put the image into a Qt object
-
 
1434
	QImage image((uchar*)buf.raw_data(), m.getWidth(), m.getHeight(), QImage::Format_ARGB32);
-
 
1435
	label->setPixmap(QPixmap::fromImage(image.rgbSwapped()));
1262
	// Create a unique file name
1436
	// Create a unique file name
1263
	pid = getpid();
1437
//	pid = getpid();
1264
	hv0.sprintf("/var/tmp/SportWatcher_%d", pid);
1438
//	OutBuf.sprintf("/var/tmp/SportWatcher_%d.png", pid);
1265
	save_to_file<ImageData32>(buf.data(), hv0.toAscii().data(), "png");
1439
//	save_to_file<ImageData32>(buf.data(), OutBuf.toAscii().data(), "png");
1266
 
1440
 
1267
	// Now we move the image into a QPixmap
-
 
1268
	QPixmap pm;
-
 
1269
	pm.load(hv0);
-
 
1270
	unlink(hv0.toAscii().data());	// delete the temporary file
-
 
1271
	label->setPixmap(pm);
-
 
1272
	return true;
1441
	return true;
1273
}
1442
}
1274
 
1443
 
-
 
1444
void SRender::setMaxExtent(double lx, double ly, double rx, double ry)
-
 
1445
{
-
 
1446
	if (lx > 0 && _lx > lx)
-
 
1447
	   _lx = lx;
-
 
1448
 
-
 
1449
	if (lx < 0 && _lx < lx)
-
 
1450
	   _lx = lx;
-
 
1451
 
-
 
1452
	if (ly > 0 && _ly > ly)
-
 
1453
	   _ly = ly;
-
 
1454
 
-
 
1455
	if (ly < 0 && _ly < ly)
-
 
1456
	   _ly = ly;
-
 
1457
 
-
 
1458
	if (rx > 0 && _rx < rx)
-
 
1459
	   _rx = rx;
-
 
1460
 
-
 
1461
	if (rx < 0 && _rx > rx)
-
 
1462
	   _rx = rx;
-
 
1463
 
-
 
1464
	if (ry > 0 && _ry < ry)
-
 
1465
	   _ry = ry;
-
 
1466
 
-
 
1467
	if (ry < 0 && _ry > ry)
-
 
1468
	   _ry = ry;
-
 
1469
}
-
 
1470
 
-
 
1471
QString SRender::findIcon(QString ic)
-
 
1472
{
-
 
1473
QString ptf, icon;
-
 
1474
QFileInfo fi(ic);
-
 
1475
 
-
 
1476
	icon = fi.fileName();
-
 
1477
	ptf = KStandardDirs::locate("data", QString("sportwatcher/icons/%1").arg(icon));
-
 
1478
 
-
 
1479
	if (ptf.length() < icon.length())
-
 
1480
	{
-
 
1481
	   KMessageBox::error(0, i18n("The icon %1 was not found!").arg(icon));
-
 
1482
	   ptf.clear();
-
 
1483
	}
-
 
1484
 
-
 
1485
	return ptf;
-
 
1486
}
-
 
1487
 
1275
RULE *SRender::getLastRule(RULE *first)
1488
RULE *SRender::getLastRule(RULE *first)
1276
{
1489
{
1277
RULE *akt = first;
1490
RULE *akt = first;
1278
 
1491
 
1279
	while (akt)
1492
	while (akt)
Line 1409... Line 1622...
1409
 
1622
 
1410
unsigned SRender::colorToUInt(QString col)
1623
unsigned SRender::colorToUInt(QString col)
1411
{
1624
{
1412
QColor qc(col);
1625
QColor qc(col);
1413
 
1626
 
1414
	return (qc.red() * 65536) + (qc.green() * 256) + qc.blue();
1627
	return (qc.blue() * 65536) + (qc.green() * 256) + qc.red();
1415
}
1628
}
1416
 
1629
 
1417
STYLE *SRender::allocStyle()
1630
STYLE *SRender::allocStyle()
1418
{
1631
{
1419
STYLE *St = new STYLE;
1632
STYLE *St = new STYLE;
Line 1447... Line 1660...
1447
LAYER *La = new LAYER;
1660
LAYER *La = new LAYER;
1448
 
1661
 
1449
	La->name.clear();	// The unique name
1662
	La->name.clear();	// The unique name
1450
	La->status = false;	// Is it active?
1663
	La->status = false;	// Is it active?
1451
	La->srs.clear();	// Projection
1664
	La->srs.clear();	// Projection
-
 
1665
	La->minzoom = 0.0;
-
 
1666
	La->maxzoom = 0.0;
1452
	La->Datasource.type.clear();
1667
	La->Datasource.type.clear();
1453
	La->Datasource.file.clear();
1668
	La->Datasource.file.clear();
1454
	La->Datasource.host.clear();
1669
	La->Datasource.host.clear();
1455
	La->Datasource.user.clear();
1670
	La->Datasource.user.clear();
1456
	La->Datasource.dbname.clear();
1671
	La->Datasource.dbname.clear();
Line 1481... Line 1696...
1481
SHIELDSYMBOLIZER *ss = new SHIELDSYMBOLIZER;
1696
SHIELDSYMBOLIZER *ss = new SHIELDSYMBOLIZER;
1482
 
1697
 
1483
	ss->name.clear();
1698
	ss->name.clear();
1484
	ss->face_name.clear();
1699
	ss->face_name.clear();
1485
	ss->size = 0.0;
1700
	ss->size = 0.0;
1486
	ss->fill = 0;		// Color
1701
	ss->fill = 0;			// Color
1487
	ss->placement.clear();
1702
	ss->placement.clear();
1488
	ss->file.clear();
1703
	ss->file.clear();
1489
	ss->type = type_png;		// enum TYPES
1704
	ss->type = type_png;		// enum TYPES
1490
	ss->width = 0.0;
1705
	ss->width = 0.0;
1491
	ss->height = 0.0;
1706
	ss->height = 0.0;
-
 
1707
	ss->dx = 0.0;
-
 
1708
	ss->dy = 0.0;
1492
	ss->mindistance = 0.0;
1709
	ss->mindistance = 0.0;
1493
	ss->maxdistance = 0.0;
1710
	ss->maxdistance = 0.0;
1494
	ss->next = 0;
1711
	ss->next = 0;
1495
	return ss;
1712
	return ss;
1496
}
1713
}
Line 1529... Line 1746...
1529
	ts->face_name.clear();
1746
	ts->face_name.clear();
1530
	ts->size = 0;
1747
	ts->size = 0;
1531
	ts->fill = 0;			// Color
1748
	ts->fill = 0;			// Color
1532
	ts->halo_radius = 0;
1749
	ts->halo_radius = 0;
1533
	ts->wrap_width = 0;
1750
	ts->wrap_width = 0;
-
 
1751
	ts->dx = 0.0;
1534
	ts->dy = 0.0;
1752
	ts->dy = 0.0;
1535
	ts->mindistance = 0.0;
1753
	ts->mindistance = 0.0;
1536
	ts->maxdistance = 0.0;
1754
	ts->maxdistance = 0.0;
1537
	ts->next = 0;
1755
	ts->next = 0;
1538
	return ts;
1756
	return ts;