All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SymbologySerializer.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/se/serialization/xml/SymbologySerializer.cpp
22 
23  \brief Data serialization for the Symbology Encoding module.
24 */
25 
26 // TerraLib
27 #include "../../../fe/serialization/xml/Filter.h"
28 #include "../../../fe/serialization/xml/Expression.h"
29 #include "../../../xlink/serialization/xml/XLinkSerializer.h"
30 #include "../../../xml/AbstractWriter.h"
31 #include "../../../xml/Reader.h"
32 #include "../../AnchorPoint.h"
33 #include "../../Categorize.h"
34 #include "../../ChannelSelection.h"
35 #include "../../ColorMap.h"
36 #include "../../ContrastEnhancement.h"
37 #include "../../Description.h"
38 #include "../../Displacement.h"
39 #include "../../ExternalGraphic.h"
40 #include "../../Fill.h"
41 #include "../../Font.h"
42 #include "../../Graphic.h"
43 #include "../../GraphicStroke.h"
44 #include "../../Halo.h"
45 #include "../../ImageOutline.h"
46 #include "../../InlineContent.h"
47 #include "../../Interpolate.h"
48 #include "../../InterpolationPoint.h"
49 #include "../../LabelPlacement.h"
50 #include "../../LinePlacement.h"
51 #include "../../Mark.h"
52 #include "../../ParameterValue.h"
53 #include "../../PointPlacement.h"
54 #include "../../RasterSymbolizer.h"
55 #include "../../Rule.h"
56 #include "../../SelectedChannel.h"
57 #include "../../ShadedRelief.h"
58 #include "../../Stroke.h"
59 #include "../../SvgParameter.h"
60 #include "../../Symbolizer.h"
61 #include "SymbologySerializer.h"
62 #include "Symbolizer.h"
63 #include "Utils.h"
64 
65 // STL
66 #include <cassert>
67 #include <memory>
68 
69 //#ifdef TE_ENABLED_XML
70 
72 {
73  assert(reader.getNodeType() == te::xml::START_ELEMENT);
74  assert(reader.getElementLocalName() == "AnchorPoint");
75 
76  reader.next();
77 
78  std::auto_ptr<te::se::AnchorPoint> ap(new te::se::AnchorPoint);
79 
80  assert(reader.getElementLocalName() == "AnchorPointX");
81  reader.next();
82  ap->setAnchorPointX(ReadParameterValue(reader));
83 
84  assert(reader.getElementLocalName() == "AnchorPointY");
85  reader.next();
86  ap->setAnchorPointY(ReadParameterValue(reader));
87 
88  assert(reader.getNodeType() == te::xml::END_ELEMENT);
89  reader.next();
90 
91  return ap.release();
92 }
93 
95 {
96  if(ap == 0)
97  return;
98 
99  writer.writeStartElement("se:AnchorPoint");
100 
101  WriteParameterValuePtrHelper("se:AnchorPointX", ap->getAnchorPointX(), writer);
102  WriteParameterValuePtrHelper("se:AnchorPointY", ap->getAnchorPointY(), writer);
103 
104  writer.writeEndElement("se:AnchorPoint");
105 }
106 
108 {
109  assert(reader.getNodeType() == te::xml::START_ELEMENT);
110  assert(reader.getElementLocalName() == "Categorize");
111 
112  assert(reader.hasAttrs());
113 
114  std::auto_ptr<te::se::Categorize> c(new te::se::Categorize);
115 
116  // FallBackValue Attribute
117  std::string fbv = reader.getAttr("fallbackValue");
118  assert(!fbv.empty());
119  c->setFallbackValue(fbv);
120 
121  // ThreshholdsBelongTo Attribute
122  std::string tbt = reader.getAttr("threshholdsBelongTo");
123  assert(!tbt.empty() && (tbt == "preceding" || tbt == "succeeding"));
124  tbt == "preceding" ? c->setThresholdsBelongTo(te::se::Categorize::PRECEDING) : c->setThresholdsBelongTo(te::se::Categorize::SUCCEEDING);
125 
126  reader.next();
127 
128  // LookupValue
129  assert(reader.getElementLocalName() == "LookupValue");
130  reader.next();
131  c->setLookupValue(ReadParameterValue(reader));
132 
133  // Value
134  assert(reader.getElementLocalName() == "Value");
135  reader.next();
136  c->addValue(ReadParameterValue(reader));
137 
138  // Threshold + Value
139  while(reader.getNodeType() == te::xml::START_ELEMENT &&
140  reader.getElementLocalName() == "Threshold")
141  {
142  reader.next();
143  c->addThreshold(ReadParameterValue(reader));
144 
145  assert(reader.getElementLocalName() == "Value");
146  reader.next();
147  c->addValue(ReadParameterValue(reader));
148  }
149 
150  assert(reader.getNodeType() == te::xml::END_ELEMENT);
151  reader.next();
152 
153  return c.release();
154 }
155 
157 {
158  if(c == 0)
159  return;
160 
161  writer.writeStartElement("se:Categorize");
162 
163  writer.writeAttribute("fallbackValue", c->getFallbackValue());
164 
166  switch(type)
167  {
169  break;
170 
172  writer.writeAttribute("threshholdsBelongTo", "preceding");
173  break;
174 
176  writer.writeAttribute("threshholdsBelongTo", "succeeding");
177  break;
178  }
179 
180  WriteParameterValuePtrHelper("se:LookupValue", c->getLookupValue(), writer);
181  WriteParameterValuePtrHelper("se:Value", c->getValue(), writer);
182 
183  std::vector<te::se::ParameterValue*> thresholds = c->getThresholds();
184  std::vector<te::se::ParameterValue*> values = c->getThresholdValues();
185  assert(thresholds.size() == values.size()-1);
186 
187  for(std::size_t i = 0; i < values.size(); ++i)
188  {
189  WriteParameterValuePtrHelper("se:Value", values[i], writer);
190 
191  if(i != values.size()-1)
192  WriteParameterValuePtrHelper("se:Threshold", thresholds[i], writer);
193  }
194 
195  writer.writeEndElement("se:Categorize");
196 }
197 
199 {
200  assert(reader.getNodeType() == te::xml::START_ELEMENT);
201  assert(reader.getElementLocalName() == "ChannelSelection");
202 
203  reader.next();
204 
205  std::auto_ptr<te::se::ChannelSelection> cs(new te::se::ChannelSelection);
206  cs->setColorCompositionType(te::se::UNKNOWN_COMPOSITION);
207 
208  // GrayChannel
209  if(reader.getElementLocalName() == "GrayChannel")
210  {
211  cs->setGrayChannel(ReadSelectedChannel(reader));
212  cs->setColorCompositionType(te::se::GRAY_COMPOSITION);
213 
214  assert(reader.getNodeType() == te::xml::END_ELEMENT);
215  reader.next();
216 
217  return cs.release();
218  }
219 
220  std::size_t nChannels = 0; // To count the number of channels
221 
222  // RedChannel
223  if(reader.getElementLocalName() == "RedChannel")
224  {
225  cs->setRedChannel(ReadSelectedChannel(reader));
226  cs->setColorCompositionType(te::se::RED_COMPOSITION);
227  nChannels++;
228  }
229 
230  // GreenChannel
231  if(reader.getElementLocalName() == "GreenChannel")
232  {
233  cs->setGreenChannel(ReadSelectedChannel(reader));
234  cs->setColorCompositionType(te::se::GREEN_COMPOSITION);
235  nChannels++;
236  }
237 
238  // BlueChannel
239  if(reader.getElementLocalName() == "BlueChannel")
240  {
241  cs->setBlueChannel(ReadSelectedChannel(reader));
242  cs->setColorCompositionType(te::se::BLUE_COMPOSITION);
243  nChannels++;
244  }
245 
246  assert(nChannels > 0);
247 
248  // Adjusting...
249  if(nChannels > 1)
250  nChannels == 3 ? cs->setColorCompositionType(te::se::RGB_COMPOSITION) : cs->setColorCompositionType(te::se::UNKNOWN_COMPOSITION);
251 
252  assert(reader.getNodeType() == te::xml::END_ELEMENT);
253  reader.next();
254 
255  return cs.release();
256 }
257 
259 {
260  if(cs == 0)
261  return;
262 
263  writer.writeStartElement("se:ChannelSelection");
264 
266  {
267  WriteSelectedChannelHelper("se:GrayChannel", cs->getGrayChannel(), writer);
268  }
270  {
271  WriteSelectedChannelHelper("se:RedChannel", cs->getRedChannel(), writer);
272  }
274  {
275  WriteSelectedChannelHelper("se:GreenChannel", cs->getGreenChannel(), writer);
276  }
278  {
279  WriteSelectedChannelHelper("se:BlueChannel", cs->getBlueChannel(), writer);
280  }
282  {
283  WriteSelectedChannelHelper("se:RedChannel", cs->getRedChannel(), writer);
284  WriteSelectedChannelHelper("se:GreenChannel", cs->getGreenChannel(), writer);
285  WriteSelectedChannelHelper("se:BlueChannel", cs->getBlueChannel(), writer);
286  }
287 
288  writer.writeEndElement("se:ChannelSelection");
289 }
290 
292 {
293  assert(reader.getNodeType() == te::xml::START_ELEMENT);
294  assert(reader.getElementLocalName() == "ColorMap");
295 
296  reader.next();
297 
298  std::auto_ptr<te::se::ColorMap> cm(new te::se::ColorMap);
299 
300  if(reader.getElementLocalName() == "Categorize")
301  cm->setCategorize(ReadCategorize(reader));
302  else // Interpolate
303  cm->setInterpolate(ReadInterpolate(reader));
304 
305  assert(reader.getNodeType() == te::xml::END_ELEMENT);
306  reader.next();
307 
308  return cm.release();
309 }
310 
312 {
313  if(cm == 0)
314  return;
315 
316  writer.writeStartElement("se:ColorMap");
317 
318  te::se::Categorize* categorize = cm->getCategorize();
319  if(categorize)
320  Save(categorize, writer);
321  else
322  {
323  te::se::Interpolate* interpolate = cm->getInterpolate();
324  assert(interpolate);
325  Save(interpolate, writer);
326  }
327 
328  writer.writeEndElement("se:ColorMap");
329 }
330 
332 {
333  assert(reader.getNodeType() == te::xml::START_ELEMENT);
334  assert(reader.getElementLocalName() == "ContrastEnhancement");
335 
336  reader.next();
337 
338  std::auto_ptr<te::se::ContrastEnhancement> ce(new te::se::ContrastEnhancement);
339  ce->setContrastEnhancementType(te::se::ContrastEnhancement::ENHANCEMENT_NONE);
340 
341  if(reader.getElementLocalName() == "Histogram")
342  {
343  ce->setContrastEnhancementType(te::se::ContrastEnhancement::ENHANCEMENT_HISTOGRAM);
344  reader.next();
345  }
346  else if(reader.getElementLocalName() == "Normalize")
347  {
348  ce->setContrastEnhancementType(te::se::ContrastEnhancement::ENHANCEMENT_NORMALIZE);
349  reader.next();
350  }
351 
352  if(reader.getElementLocalName() == "GammaValue")
353  {
354  reader.next();
355  assert(reader.getNodeType() == te::xml::VALUE);
356  ce->setGammaValue(reader.getElementValueAsDouble());
357  reader.next();
358  assert(reader.getNodeType() == te::xml::END_ELEMENT);
359  reader.next();
360  }
361 
362  assert(reader.getNodeType() == te::xml::END_ELEMENT);
363  reader.next();
364 
365  return ce.release();
366 }
367 
369 {
370  if(ce == 0)
371  return;
372 
373  writer.writeStartElement("se:ContrastEnhancement");
375  switch(type)
376  {
378  break;
379 
381  writer.writeElement("se:Histogram", ""); // TODO: Writer method to writer a empty element, i.e. <Histogram/>
382  break;
383 
385  writer.writeElement("se:Normalize", ""); // TODO: Writer method to writer a empty element, i.e. <Normalize/>
386  break;
387  }
388 
389  writer.writeElement("se:GammaValue", ce->getGammaValue());
390 
391  writer.writeEndElement("se:ContrastEnhancement");
392 }
393 
395 {
396  assert(reader.getNodeType() == te::xml::START_ELEMENT);
397  assert(reader.getElementLocalName() == "Description");
398 
399  reader.next();
400 
401  std::auto_ptr<te::se::Description> description(new te::se::Description);
402 
403  // Title
404  if(reader.getElementLocalName() == "Title")
405  {
406  reader.next();
407  assert(reader.getNodeType() == te::xml::VALUE);
408  std::string title = reader.getElementValue();
409  description->setTitle(title);
410  reader.next();
411 
412  assert(reader.getNodeType() == te::xml::END_ELEMENT);
413  reader.next();
414  }
415 
416  // Abstract
417  if(reader.getElementLocalName() == "Abstract")
418  {
419  reader.next();
420  assert(reader.getNodeType() == te::xml::VALUE);
421  std::string abs = reader.getElementValue();
422  description->setAbstract(abs);
423  reader.next();
424 
425  assert(reader.getNodeType() == te::xml::END_ELEMENT);
426  reader.next();
427  }
428 
429  assert(reader.getNodeType() == te::xml::END_ELEMENT);
430  reader.next();
431 
432  return description.release();
433 }
434 
436 {
437  if(d == 0)
438  return;
439 
440  writer.writeStartElement("se:Description");
441 
442  if(!d->getTitle().empty())
443  writer.writeElement("se:Title", d->getTitle());
444 
445  if(!d->getAbstract().empty())
446  writer.writeElement("se:Abstract", d->getAbstract());
447 
448  writer.writeEndElement("se:Description");
449 }
450 
452 {
453  assert(reader.getNodeType() == te::xml::START_ELEMENT);
454  assert(reader.getElementLocalName() == "Displacement");
455 
456  reader.next();
457 
458  std::auto_ptr<te::se::Displacement> d(new te::se::Displacement);
459 
460  assert(reader.getElementLocalName() == "DisplacementX");
461  reader.next();
462  d->setDisplacementX(ReadParameterValue(reader));
463 
464  assert(reader.getElementLocalName() == "DisplacementY");
465  reader.next();
466  d->setDisplacementY(ReadParameterValue(reader));
467 
468  assert(reader.getNodeType() == te::xml::END_ELEMENT);
469  reader.next();
470 
471  return d.release();
472 }
473 
475 {
476  if(d == 0)
477  return;
478 
479  writer.writeStartElement("se:Displacement");
480 
481  WriteParameterValuePtrHelper("se:DisplacementX", d->getDisplacementX(), writer);
482  WriteParameterValuePtrHelper("se:DisplacementY", d->getDisplacementY(), writer);
483 
484  writer.writeEndElement("se:Displacement");
485 }
486 
488 {
489  assert(reader.getNodeType() == te::xml::START_ELEMENT);
490  assert(reader.getElementLocalName() == "ExternalGraphic");
491 
492  reader.next();
493 
494  std::auto_ptr<te::se::ExternalGraphic> eg(new te::se::ExternalGraphic);
495 
496  if(reader.getElementLocalName() == "OnlineResource")
497  eg->setOnlineResource(te::xl::serialize::ReadSimpleLink(reader));
498  else // InlineContent
499  eg->setInlineContent(ReadInlineContent(reader));
500 
501  reader.next();
502  assert(reader.getNodeType() == te::xml::END_ELEMENT);
503 
504  reader.next();
505 
506  // Format
507  assert(reader.getElementLocalName() == "Format");
508  reader.next();
509  assert(reader.getNodeType() == te::xml::VALUE);
510  eg->setFormat(reader.getElementValue());
511  reader.next();
512 
513  // Recodes (...)
514 
515  assert(reader.getNodeType() == te::xml::END_ELEMENT);
516  reader.next();
517 
518  assert(reader.getNodeType() == te::xml::END_ELEMENT);
519  reader.next();
520 
521  return eg.release();
522 }
523 
525 {
526  if(eg == 0)
527  return;
528 
529  writer.writeStartElement("se:ExternalGraphic");
530 
531  const te::xl::SimpleLink* link = eg->getOnlineResource();
532  if(link)
534  else
535  {
536  const te::se::InlineContent* ic = eg->getInlineContent();
537  assert(ic);
538  Save(ic, writer);
539  }
540  const std::string& format = eg->getFormat();
541  assert(!format.empty());
542  writer.writeElement("se:Format", format);
543 
544  // Recodes (...)
545 
546  writer.writeEndElement("se:ExternalGraphic");
547 }
548 
550 {
551  assert(reader.getNodeType() == te::xml::START_ELEMENT);
552  assert(reader.getElementLocalName() == "Fill");
553 
554  reader.next();
555 
556  std::auto_ptr<te::se::Fill> fill(new te::se::Fill);
557 
558  // GraphicFill
559  if(reader.getElementLocalName() == "GraphicFill")
560  {
561  reader.next();
562  fill->setGraphicFill(ReadGraphic(reader));
563  assert(reader.getNodeType() == te::xml::END_ELEMENT);
564  reader.next();
565  }
566 
567  // SvgParameters
568  while(reader.getNodeType() == te::xml::START_ELEMENT &&
569  reader.getElementLocalName() == "SvgParameter")
570  fill->add(ReadSvgParameter(reader));
571 
572  assert(reader.getNodeType() == te::xml::END_ELEMENT);
573  reader.next();
574 
575  return fill.release();
576 }
577 
579 {
580  if(fill == 0)
581  return;
582 
583  writer.writeStartElement("se:Fill");
584 
585  const te::se::Graphic* g = fill->getGraphicFill();
586  if(g)
587  {
588  writer.writeStartElement("se:GraphicFill");
589  Save(g, writer);
590  writer.writeEndElement("se:GraphicFill");
591  }
592  else
593  {
594  Save(fill->getColor(), writer);
595  Save(fill->getOpacity(), writer);
596  }
597 
598  writer.writeEndElement("se:Fill");
599 }
600 
602 {
603  assert(reader.getNodeType() == te::xml::START_ELEMENT);
604  assert(reader.getElementLocalName() == "Font");
605 
606  reader.next();
607 
608  std::auto_ptr<te::se::Font> font(new te::se::Font);
609 
610  // SvgParameters
611  while(reader.getNodeType() == te::xml::START_ELEMENT &&
612  reader.getElementLocalName() == "SvgParameter")
613  font->add(ReadSvgParameter(reader));
614 
615  assert(reader.getNodeType() == te::xml::END_ELEMENT);
616  reader.next();
617 
618  return font.release();
619 }
620 
622 {
623  if(font == 0)
624  return;
625 
626  writer.writeStartElement("se:Font");
627 
628  Save(font->getFamily(), writer);
629  Save(font->getStyle(), writer);
630  Save(font->getWeight(), writer);
631  Save(font->getSize(), writer);
632 
633  writer.writeEndElement("se:Font");
634 }
635 
637 {
638  assert(reader.getNodeType() == te::xml::START_ELEMENT);
639  assert(reader.getElementLocalName() == "Graphic");
640 
641  reader.next();
642 
643  std::auto_ptr<te::se::Graphic> graphic(new te::se::Graphic);
644 
645  while(reader.getNodeType() == te::xml::START_ELEMENT &&
646  (reader.getElementLocalName() == "Mark" ||
647  reader.getElementLocalName() == "ExternalGraphic"))
648  reader.getElementLocalName() == "Mark" ? graphic->add(ReadMark(reader)) : graphic->add(ReadExternalGraphic(reader));
649 
650  // Opacity
651  if(reader.getElementLocalName() == "Opacity")
652  {
653  reader.next();
654  graphic->setOpacity(ReadParameterValue(reader));
655  }
656 
657  // Size
658  if(reader.getElementLocalName() == "Size")
659  {
660  reader.next();
661  graphic->setSize(ReadParameterValue(reader));
662  }
663 
664  // Rotation
665  if(reader.getElementLocalName() == "Rotation")
666  {
667  reader.next();
668  graphic->setRotation(ReadParameterValue(reader));
669  }
670 
671  // AnchorPoint
672  if(reader.getElementLocalName() == "AnchorPoint")
673  graphic->setAnchorPoint(ReadAnchorPoint(reader));
674 
675  // Displacement
676  if(reader.getElementLocalName() == "Displacement")
677  graphic->setDisplacement(ReadDisplacement(reader));
678 
679  assert(reader.getNodeType() == te::xml::END_ELEMENT);
680  reader.next();
681 
682  return graphic.release();
683 }
684 
686 {
687  if(graphic == 0)
688  return;
689 
690  writer.writeStartElement("se:Graphic");
691 
692  const std::vector<te::se::Mark*> marks = graphic->getMarks();
693  for(std::size_t i = 0; i < marks.size(); ++i)
694  Save(marks[i], writer);
695 
696  const std::vector<te::se::ExternalGraphic*> egs = graphic->getExternalGraphics();
697  for(std::size_t i = 0; i < egs.size(); ++i)
698  Save(egs[i], writer);
699 
700  WriteParameterValuePtrHelper("se:Opacity", graphic->getOpacity(), writer);
701  WriteParameterValuePtrHelper("se:Size", graphic->getSize(), writer);
702  WriteParameterValuePtrHelper("se:Rotation", graphic->getRotation(), writer);
703 
704  Save(graphic->getAnchorPoint(), writer);
705  Save(graphic->getDisplacement(), writer);
706 
707  writer.writeEndElement("se:Graphic");
708 }
709 
711 {
712  assert(reader.getNodeType() == te::xml::START_ELEMENT);
713  assert(reader.getElementLocalName() == "GraphicStroke");
714 
715  reader.next();
716 
717  std::auto_ptr<te::se::GraphicStroke> graphicStroke(new te::se::GraphicStroke);
718 
719  assert(reader.getElementLocalName() == "Graphic");
720  graphicStroke->setGraphic(ReadGraphic(reader));
721 
722  // InitialGap
723  if(reader.getElementLocalName() == "InitialGap")
724  {
725  reader.next();
726  graphicStroke->setInitialGap(ReadParameterValue(reader));
727  }
728 
729  // Gap
730  if(reader.getElementLocalName() == "Gap")
731  {
732  reader.next();
733  graphicStroke->setGap(ReadParameterValue(reader));
734  }
735 
736  assert(reader.getNodeType() == te::xml::END_ELEMENT);
737  reader.next();
738 
739  return graphicStroke.release();
740 }
741 
743 {
744  if(graphicStroke == 0)
745  return;
746 
747  writer.writeStartElement("se:GraphicStroke");
748 
749  const te::se::Graphic* graphic = graphicStroke->getGraphic();
750  assert(graphic);
751  Save(graphic, writer);
752 
753  WriteParameterValuePtrHelper("se:InitialGap", graphicStroke->getInitialGap(), writer);
754  WriteParameterValuePtrHelper("se:Gap", graphicStroke->getGap(), writer);
755 
756  writer.writeEndElement("se:GraphicStroke");
757 }
758 
760 {
761  assert(reader.getNodeType() == te::xml::START_ELEMENT);
762  assert(reader.getElementLocalName() == "Halo");
763 
764  reader.next();
765 
766  std::auto_ptr<te::se::Halo> halo(new te::se::Halo);
767 
768  // Radius
769  if(reader.getElementLocalName() == "Radius")
770  {
771  reader.next();
772  halo->setRadius(ReadParameterValue(reader));
773  }
774 
775  // Fill
776  if(reader.getElementLocalName() == "Fill")
777  halo->setFill(ReadFill(reader));
778 
779  assert(reader.getNodeType() == te::xml::END_ELEMENT);
780  reader.next();
781 
782  return halo.release();
783 }
784 
786 {
787  if(halo == 0)
788  return;
789 
790  writer.writeStartElement("se:Halo");
791 
792  WriteParameterValuePtrHelper("se:Radius", halo->getRadius(), writer);
793  Save(halo->getFill(), writer);
794 
795  writer.writeEndElement("se:Halo");
796 }
797 
799 {
800  assert(reader.getNodeType() == te::xml::START_ELEMENT);
801  assert(reader.getElementLocalName() == "ImageOutline");
802 
803  reader.next();
804 
805  std::auto_ptr<te::se::ImageOutline> imageOutline(new te::se::ImageOutline);
806  imageOutline->setSymbolizer(Symbolizer::getInstance().read(reader));
807 
808  assert(reader.getNodeType() == te::xml::END_ELEMENT);
809  reader.next();
810 
811  return imageOutline.release();
812 }
813 
815 {
816  if(imageOutline == 0)
817  return;
818 
819  writer.writeStartElement("se:ImageOutline");
820 
821  assert(imageOutline->getSymbolizer());
822  Symbolizer::getInstance().write(imageOutline->getSymbolizer(), writer);
823 
824  writer.writeEndElement("se:ImageOutline");
825 }
826 
828 {
829  assert(reader.getNodeType() == te::xml::START_ELEMENT);
830  assert(reader.getElementLocalName() == "InlineContent");
831 
832  std::string encondingValue = reader.getAttr("enconding");
833  assert(encondingValue == "xml" || encondingValue == "base64");
834 
836  encondingValue == "xml" ? encodingType = te::se::InlineContent::XML : encodingType = te::se::InlineContent::BASE64;
837 
838  std::string data = reader.getElementValue();
839 
840  std::auto_ptr<te::se::InlineContent> ic(new te::se::InlineContent(encodingType));
841  ic->setData(data);
842 
843  reader.next();
844 
845  assert(reader.getNodeType() == te::xml::END_ELEMENT);
846  reader.next();
847 
848  return ic.release();
849 }
850 
852 {
853  if(ic == 0)
854  return;
855 
856  writer.writeStartElement("se:InlineContent");
857  ic->getEncoding() == te::se::InlineContent::XML ? writer.writeAttribute("enconding", "xml") : writer.writeAttribute("enconding", "base64");
858  writer.writeValue(ic->getData());
859  writer.writeEndElement("se:InlineContent");
860 }
861 
863 {
864  assert(reader.getNodeType() == te::xml::START_ELEMENT);
865  assert(reader.getElementLocalName() == "Interpolate");
866 
867  assert(reader.hasAttrs());
868 
869  std::auto_ptr<te::se::Interpolate> interpolate(new te::se::Interpolate);
870 
871  // FallBackValue Attribute
872  std::string fbv = reader.getAttr("fallbackValue");
873  assert(!fbv.empty());
874  interpolate->setFallbackValue(fbv);
875 
876  // Mode Attribute
877  std::string mode = reader.getAttr("mode");
878  assert(!mode.empty() && (mode == "linear" || mode == "cosine" || mode == "cubic"));
879  if(mode == "linear")
880  interpolate->setModeType(te::se::Interpolate::LINEAR);
881  else if(mode == "cosine")
882  interpolate->setModeType(te::se::Interpolate::COSINE);
883  else
884  interpolate->setModeType(te::se::Interpolate::CUBIC);
885 
886  // Method Attribute
887  std::string method = reader.getAttr("method");
888  assert(!method.empty() && (method == "numeric" || method == "color"));
889  method == "numeric" ? interpolate->setMethodType(te::se::Interpolate::NUMERIC) : interpolate->setMethodType(te::se::Interpolate::COLOR);
890 
891  reader.next();
892 
893  // LookupValue
894  assert(reader.getElementLocalName() == "LookupValue");
895  reader.next();
896  interpolate->setLookupValue(ReadParameterValue(reader));
897 
898  // InterpolationPoints
899  while(reader.getNodeType() == te::xml::START_ELEMENT &&
900  reader.getElementLocalName() == "InterpolationPoint")
901  {
902  //reader.next();
903  interpolate->add(ReadInterpolationPoint(reader));
904  }
905 
906  assert(reader.getNodeType() == te::xml::END_ELEMENT);
907  reader.next();
908 
909  return interpolate.release();
910 }
911 
913 {
914  if(interpolate == 0)
915  return;
916 
917  writer.writeStartElement("se:Interpolate");
918 
919  writer.writeAttribute("fallbackValue", interpolate->getFallbackValue());
920 
921  te::se::Interpolate::ModeType modeType = interpolate->getModeType();
922  switch(modeType)
923  {
925  writer.writeAttribute("mode", "linear");
926  break;
927 
929  writer.writeAttribute("mode", "cosine");
930  break;
931 
933  writer.writeAttribute("mode", "cubic");
934  break;
935  }
936 
937  te::se::Interpolate::MethodType methodType = interpolate->geMethodType();
938  switch(methodType)
939  {
941  writer.writeAttribute("method", "numeric");
942  break;
943 
945  writer.writeAttribute("method", "color");
946  break;
947  }
948 
949  WriteParameterValuePtrHelper("se:LookupValue", interpolate->getLookupValue(), writer);
950 
951  const std::vector<te::se::InterpolationPoint*> ipts = interpolate->getInterpolationPoints();
952  assert(!ipts.empty());
953  for(std::size_t i = 0; i < ipts.size(); ++i)
954  Save(ipts[i], writer);
955 
956  writer.writeEndElement("se:Interpolate");
957 }
958 
960 {
961  assert(reader.getNodeType() == te::xml::START_ELEMENT);
962  assert(reader.getElementLocalName() == "InterpolationPoint");
963 
964  std::auto_ptr<te::se::InterpolationPoint> ip(new te::se::InterpolationPoint);
965 
966  reader.next();
967  assert(reader.getElementLocalName() == "Data");
968  reader.next();
969  assert(reader.getNodeType() == te::xml::VALUE);
970  double data = reader.getElementValueAsDouble();
971  ip->setData(data);
972 
973  reader.next();
974  reader.next();
975 
976  assert(reader.getElementLocalName() == "Value");
977  reader.next();
978  ip->setValue(ReadParameterValue(reader));
979 
980  assert(reader.getNodeType() == te::xml::END_ELEMENT);
981  reader.next();
982 
983  return ip.release();
984 }
985 
987 {
988  if(ip == 0)
989  return;
990 
991  writer.writeStartElement("se:InterpolationPoint");
992 
993  writer.writeElement("se:Data", ip->getData());
994  assert(ip->getValue());
995  WriteParameterValuePtrHelper("se:Value", ip->getValue(), writer);
996 
997  writer.writeEndElement("se:InterpolationPoint");
998 }
999 
1001 {
1002  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1003  assert(reader.getElementLocalName() == "LabelPlacement");
1004 
1005  reader.next();
1006 
1007  std::auto_ptr<te::se::LabelPlacement> lp(new te::se::LabelPlacement);
1008 
1009  if(reader.getElementLocalName() == "PointPlacement")
1010  lp->setPointPlacement(ReadPointPlacement(reader));
1011  else // LinePlacement
1012  lp->setLinePlacement(ReadLinePlacement(reader));
1013 
1014  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1015  reader.next();
1016 
1017  return lp.release();
1018 }
1019 
1021 {
1022  if(lp == 0)
1023  return;
1024 
1025  writer.writeStartElement("se:LabelPlacement");
1026 
1027  const te::se::PointPlacement* pp = lp->getPointPlacement();
1028  if(pp)
1029  Save(pp, writer);
1030  else
1031  {
1032  const te::se::LinePlacement* linePlacement = lp->getLinePlacement();
1033  assert(linePlacement);
1034  Save(linePlacement, writer);
1035  }
1036 
1037  writer.writeEndElement("se:LabelPlacement");
1038 }
1039 
1041 {
1042  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1043  assert(reader.getElementLocalName() == "LinePlacement");
1044 
1045  reader.next();
1046 
1047  std::auto_ptr<te::se::LinePlacement> lp(new te::se::LinePlacement);
1048 
1049  // PerpendicularOffset
1050  if(reader.getElementLocalName() == "PerpendicularOffset")
1051  {
1052  reader.next();
1053  lp->setPerpendicularOffset(ReadParameterValue(reader));
1054  }
1055 
1056  // IsRepeated
1057  if(reader.getElementLocalName() == "IsRepeated")
1058  {
1059  reader.next();
1060  assert(reader.getNodeType() == te::xml::VALUE);
1061  bool isRepeated = reader.getElementValueAsBoolean();
1062  lp->setIsRepeated(isRepeated);
1063  reader.next();
1064  }
1065 
1066  // InitialGap
1067  if(reader.getElementLocalName() == "InitialGap")
1068  {
1069  reader.next();
1070  lp->setInitialGap(ReadParameterValue(reader));
1071  }
1072 
1073  // Gap
1074  if(reader.getElementLocalName() == "Gap")
1075  {
1076  reader.next();
1077  lp->setGap(ReadParameterValue(reader));
1078  }
1079 
1080  // IsAligned
1081  if(reader.getElementLocalName() == "IsAligned")
1082  {
1083  reader.next();
1084  assert(reader.getNodeType() == te::xml::VALUE);
1085  bool isAligned = reader.getElementValueAsBoolean();
1086  lp->setIsAligned(isAligned);
1087  reader.next();
1088  }
1089 
1090  // GeneralizeLine
1091  if(reader.getElementLocalName() == "GeneralizeLine")
1092  {
1093  reader.next();
1094  assert(reader.getNodeType() == te::xml::VALUE);
1095  bool generalizeLine = reader.getElementValueAsBoolean();
1096  lp->setGeneralizeLine(generalizeLine);
1097  reader.next();
1098  }
1099 
1100  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1101  reader.next();
1102 
1103  return lp.release();
1104 }
1105 
1107 {
1108  if(lp == 0)
1109  return;
1110 
1111  writer.writeStartElement("se:LinePlacement");
1112 
1113  WriteParameterValuePtrHelper("se:PerpendicularOffset", lp->getPerpendicularOffset(), writer);
1114 
1115  std::string isRepeated;
1116  lp->isRepeated() ? isRepeated = "true" : isRepeated = "false";
1117  writer.writeElement("se:IsRepeated", isRepeated);
1118 
1119  WriteParameterValuePtrHelper("se:InitialGap", lp->getInitialGap(), writer);
1120  WriteParameterValuePtrHelper("se:Gap", lp->getGap(), writer);
1121 
1122  std::string isAligned;
1123  lp->isAligned() ? isAligned = "true" : isAligned = "false";
1124  writer.writeElement("se:IsAligned", isAligned);
1125 
1126  std::string generalizeLine;
1127  lp->getGeneralizeLine() ? generalizeLine = "true" : generalizeLine = "false";
1128  writer.writeElement("se:GeneralizeLine", generalizeLine);
1129 
1130  writer.writeEndElement("se:LinePlacement");
1131 }
1132 
1134 {
1135  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1136  assert(reader.getElementLocalName() == "Mark");
1137 
1138  reader.next();
1139 
1140  std::auto_ptr<te::se::Mark> mark(new te::se::Mark);
1141 
1142  // WellKnownName
1143  if(reader.getElementLocalName() == "WellKnownName")
1144  {
1145  reader.next();
1146  assert(reader.getNodeType() == te::xml::VALUE);
1147  mark->setWellKnownName(new std::string(reader.getElementValue()));
1148  reader.next();
1149 
1150  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1151  reader.next();
1152  }
1153  else if(reader.getElementLocalName() == "OnlineResource")
1154  mark->setOnlineResource(te::xl::serialize::ReadSimpleLink(reader));
1155  else // InlineContent
1156  mark->setInlineContent(ReadInlineContent(reader));
1157 
1158  // Fill
1159  if(reader.getElementLocalName() == "Fill")
1160  mark->setFill(ReadFill(reader));
1161 
1162  // Stroke
1163  if(reader.getElementLocalName() == "Stroke")
1164  mark->setStroke(ReadStroke(reader));
1165 
1166  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1167  reader.next();
1168 
1169  return mark.release();
1170 }
1171 
1173 {
1174  if(mark == 0)
1175  return;
1176 
1177  writer.writeStartElement("se:Mark");
1178 
1179  const std::string* wellKnownName = mark->getWellKnownName();
1180  if(wellKnownName)
1181  writer.writeElement("se:WellKnownName", *wellKnownName);
1182  else
1183  {
1184  const te::xl::SimpleLink* link = mark->getOnlineResource();
1185  if(link)
1186  WriteOnlineResourceHelper(link, writer);
1187  else
1188  {
1189  const te::se::InlineContent* ic = mark->getInlineContent();
1190  assert(ic);
1191  Save(ic, writer);
1192  }
1193  const std::string* format = mark->getFormat();
1194  assert(format);
1195  writer.writeElement("se:Format", *format);
1196 
1197  writer.writeElement("se:MarkIndex", mark->getMarkIndex());
1198  }
1199 
1200  Save(mark->getFill(), writer);
1201  Save(mark->getStroke(), writer);
1202 
1203  writer.writeEndElement("se:Mark");
1204 }
1205 
1207 {
1208  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1209  assert(reader.getElementLocalName() == "OverlapBehavior");
1210 
1211  reader.next();
1212  assert(reader.getNodeType() == te::xml::VALUE);
1213  std::string type = reader.getElementValue();
1214  reader.next();
1215 
1216  if(type == "AVERAGE")
1218 
1219  if(type == "EARLIEST_ON_TOP")
1221 
1222  if(type == "LATEST_ON_TOP")
1224 
1225  if(type == "RANDOM")
1227 
1228  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1229  reader.next();
1230 
1232 }
1233 
1235 {
1236  switch(type)
1237  {
1239  break;
1240 
1242  writer.writeElement("se:OverlapBehavior", "AVERAGE");
1243  break;
1244 
1246  writer.writeElement("se:OverlapBehavior", "EARLIEST_ON_TOP");
1247  break;
1248 
1250  writer.writeElement("se:OverlapBehavior", "LATEST_ON_TOP");
1251  break;
1252 
1254  writer.writeElement("se:OverlapBehavior", "RANDOM");
1255  break;
1256  }
1257 }
1258 
1260 {
1261  std::auto_ptr<te::se::ParameterValue> param(new te::se::ParameterValue);
1262 
1263  // Expression TODO: (n's expressions?)
1266 
1267  // TODO: and mixed data?!
1268 
1269  param->add(p);
1270 
1271  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1272  reader.next();
1273 
1274  return param.release();
1275 }
1276 
1278 {
1279  if(p == 0)
1280  return;
1281 
1282  std::size_t n = p->getNParameters();
1283 
1284  for(std::size_t i = 0; i != n; ++i)
1285  {
1286  const te::se::ParameterValue::Parameter* param = p->getParameter(i);
1287 
1288  if(param->m_mixedData)
1289  writer.writeValue(*(param->m_mixedData));
1290  else
1292  }
1293 }
1294 
1296 {
1297  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1298  assert(reader.getElementLocalName() == "PointPlacement");
1299 
1300  reader.next();
1301 
1302  std::auto_ptr<te::se::PointPlacement> pp(new te::se::PointPlacement);
1303 
1304  // AnchorPoint
1305  if(reader.getElementLocalName() == "AnchorPoint")
1306  pp->setAnchorPoint(ReadAnchorPoint(reader));
1307 
1308  // Displacement
1309  if(reader.getElementLocalName() == "Displacement")
1310  pp->setDisplacement(ReadDisplacement(reader));
1311 
1312  // Rotation
1313  if(reader.getElementLocalName() == "Rotation")
1314  {
1315  reader.next();
1316  pp->setRotation(ReadParameterValue(reader));
1317  }
1318 
1319  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1320  reader.next();
1321 
1322  return pp.release();
1323 }
1324 
1326 {
1327  if(pp == 0)
1328  return;
1329 
1330  writer.writeStartElement("se:PointPlacement");
1331 
1332  Save(pp->getAnchorPoint(), writer);
1333  Save(pp->getDisplacement(), writer);
1334  WriteParameterValuePtrHelper("se:Rotation", pp->getRotation(), writer);
1335 
1336  writer.writeEndElement("se:PointPlacement");
1337 }
1338 
1340 {
1341  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1342  assert(reader.getElementLocalName() == "Rule");
1343 
1344  reader.next();
1345 
1346  std::auto_ptr<te::se::Rule> rule(new te::se::Rule);
1347 
1348  // Name
1349  if(reader.getElementLocalName() == "Name")
1350  {
1351  reader.next();
1352  assert(reader.getNodeType() == te::xml::VALUE);
1353  rule->setName(new std::string(reader.getElementValue()));
1354  reader.next();
1355 
1356  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1357  reader.next();
1358  }
1359 
1360  // Description
1361  if(reader.getElementLocalName() == "Description")
1362  rule->setDescription(ReadDescription(reader));
1363 
1364  // LegendGraphic
1365  if(reader.getElementLocalName() == "LegendGraphic")
1366  {
1367  reader.next();
1368  rule->setLegendGraphic(ReadGraphic(reader));
1369 
1370  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1371  reader.next();
1372  }
1373 
1374  // Filter / ElseFilter
1375  if(reader.getElementLocalName() == "Filter")
1376  rule->setFilter(te::fe::serialize::ReadFilter(reader));
1377  else if(reader.getElementLocalName() == "ElseFilter")
1378  {
1379  rule->enableElseFilter();
1380  reader.next();
1381  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1382  reader.next();
1383  }
1384 
1385  // MinScaleDenominator
1386  if(reader.getElementLocalName() == "MinScaleDenominator")
1387  {
1388  reader.next();
1389  assert(reader.getNodeType() == te::xml::VALUE);
1390  double minScale = reader.getElementValueAsDouble();
1391  rule->setMinScaleDenominator(minScale);
1392  reader.next();
1393 
1394  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1395  reader.next();
1396  }
1397 
1398  // MaxScaleDenominator
1399  if(reader.getElementLocalName() == "MaxScaleDenominator")
1400  {
1401  reader.next();
1402  assert(reader.getNodeType() == te::xml::VALUE);
1403  double maxScale = reader.getElementValueAsDouble();
1404  rule->setMaxScaleDenominator(maxScale);
1405  reader.next();
1406 
1407  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1408  reader.next();
1409  }
1410 
1411  // Symbolizers
1412  while(reader.getNodeType() == te::xml::START_ELEMENT &&
1413  reader.getElementLocalName().find("Symbolizer") != std::string::npos) // TODO: For while using find("Symbolizer")... Actually, I would like to search by the registered names of symbolizer.
1414  rule->push_back(te::se::serialize::Symbolizer::getInstance().read(reader));
1415 
1416  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1417  reader.next();
1418 
1419  return rule.release();
1420 }
1421 
1423 {
1424  if(rule == 0)
1425  return;
1426 
1427  writer.writeStartElement("se:Rule");
1428 
1429  WriteStringPtrHelper("se:Name", rule->getName(), writer);
1430  Save(rule->getDescription(), writer);
1431 
1432  const te::se::Graphic* legendGraphic = rule->getLegendGraphic();
1433  if(legendGraphic)
1434  {
1435  writer.writeStartElement("se:LegendGraphic");
1436  Save(rule->getLegendGraphic(), writer);
1437  writer.writeEndElement("se:LegendGraphic");
1438  }
1439 
1440  if(rule->getFilter())
1441  te::fe::serialize::Save(rule->getFilter(), writer);
1442  else if(rule->hasElseFilter())
1443  writer.writeElement("se:ElseFilter", "");
1444 
1445  if(rule->getMinScaleDenominator() != 0.0)
1446  writer.writeElement("se:MinScaleDenominator", rule->getMinScaleDenominator());
1447 
1448  if(rule->getMaxScaleDenominator() != std::numeric_limits<double>::infinity())
1449  writer.writeElement("se:MaxScaleDenominator", rule->getMaxScaleDenominator());
1450 
1451  const std::vector<te::se::Symbolizer*>& symbs = rule->getSymbolizers();
1452  for(std::size_t i = 0; i < symbs.size(); ++i)
1453  Symbolizer::getInstance().write(symbs[i], writer);
1454 
1455  writer.writeEndElement("se:Rule");
1456 }
1457 
1459 {
1460  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1461  assert(reader.getElementLocalName() == "GrayChannel" || reader.getElementLocalName() == "RedChannel" ||
1462  reader.getElementLocalName() == "GreenChannel" || reader.getElementLocalName() == "BlueChannel");
1463 
1464  reader.next();
1465 
1466  std::auto_ptr<te::se::SelectedChannel> sc(new te::se::SelectedChannel);
1467 
1468  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1469  assert(reader.getElementLocalName() == "SourceChannelName");
1470 
1471  // SourceChannelName
1472  reader.next();
1473  assert(reader.getNodeType() == te::xml::VALUE);
1474  sc->setSourceChannelName(reader.getElementValue());
1475  reader.next();
1476 
1477  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1478  reader.next();
1479 
1480  // ContrastEnhancement
1481  if(reader.getElementLocalName() == "ContrastEnhancement")
1482  sc->setContrastEnhancement(ReadContrastEnhancement(reader));
1483 
1484  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1485  reader.next();
1486 
1487  return sc.release();
1488 }
1489 
1491 {
1492  if(sc == 0)
1493  return;
1494 
1495  assert(!sc->getSourceChannelName().empty());
1496  writer.writeElement("se:SourceChannelName", sc->getSourceChannelName());
1497 
1498  Save(sc->getContrastEnhancement(), writer);
1499 }
1500 
1502 {
1503  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1504  assert(reader.getElementLocalName() == "ShadedRelief");
1505 
1506  reader.next();
1507 
1508  std::auto_ptr<te::se::ShadedRelief> sr(new te::se::ShadedRelief);
1509 
1510  if(reader.getElementLocalName() == "BrightnessOnly")
1511  {
1512  reader.next();
1513  assert(reader.getNodeType() == te::xml::VALUE);
1514  sr->setBrightnessOnly(reader.getElementValueAsBoolean());
1515  reader.next();
1516  }
1517 
1518  if(reader.getElementLocalName() == "ReliefFactor")
1519  {
1520  reader.next();
1521  assert(reader.getNodeType() == te::xml::VALUE);
1522  sr->setReliefFactor(reader.getElementValueAsDouble());
1523  reader.next();
1524  }
1525 
1526  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1527  reader.next();
1528 
1529  return sr.release();
1530 }
1531 
1533 {
1534  if(sr == 0)
1535  return;
1536 
1537  writer.writeStartElement("se:ShadedRelief");
1538 
1539  std::string brightnessOnlyValue;
1540  sr->isBrightnessOnly() ? brightnessOnlyValue = "true" : brightnessOnlyValue = "false";
1541 
1542  writer.writeElement("se:BrightnessOnly", brightnessOnlyValue);
1543  writer.writeElement("se:ReliefFactor", sr->getReliefFactor());
1544 
1545  writer.writeEndElement("se:ShadedRelief");
1546 }
1547 
1549 {
1550  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1551  assert(reader.getElementLocalName() == "Stroke");
1552 
1553  reader.next();
1554 
1555  std::auto_ptr<te::se::Stroke> stroke(new te::se::Stroke);
1556 
1557  // GraphicFill
1558  if(reader.getElementLocalName() == "GraphicFill")
1559  {
1560  reader.next();
1561  stroke->setGraphicFill(ReadGraphic(reader));
1562 
1563  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1564  reader.next();
1565  }
1566  // GraphicStroke
1567  else if(reader.getElementLocalName() == "GraphicStroke")
1568  stroke->setGraphicStroke(ReadGraphicStroke(reader));
1569 
1570  // SvgParameters
1571  while(reader.getNodeType() == te::xml::START_ELEMENT &&
1572  reader.getElementLocalName() == "SvgParameter")
1573  stroke->add(ReadSvgParameter(reader));
1574 
1575  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1576  reader.next();
1577 
1578  return stroke.release();
1579 }
1580 
1582 {
1583  if(stroke == 0)
1584  return;
1585 
1586  writer.writeStartElement("se:Stroke");
1587 
1588  if(stroke->getGraphicFill())
1589  {
1590  writer.writeStartElement("se:GraphicFill");
1591  Save(stroke->getGraphicFill(), writer);
1592  writer.writeEndElement("se:GraphicFill");
1593  }
1594  else if(stroke->getGraphicStroke())
1595  Save(stroke->getGraphicStroke(), writer);
1596 
1597  Save(stroke->getColor(), writer);
1598  Save(stroke->getOpacity(), writer);
1599  Save(stroke->getWidth(), writer);
1600  Save(stroke->getLineJoin(), writer);
1601  Save(stroke->getLineCap(), writer);
1602  Save(stroke->getDashArray(), writer);
1603  Save(stroke->setDashOffset(), writer);
1604 
1605  writer.writeEndElement("se:Stroke");
1606 }
1607 
1609 {
1610  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1611  assert(reader.getElementLocalName() == "SvgParameter");
1612  assert(reader.hasAttrs());
1613 
1614  std::string name = reader.getAttr("name");
1615  assert(!name.empty());
1616 
1617  std::auto_ptr<te::se::SvgParameter> svgParam(new te::se::SvgParameter(name));
1618 
1619  reader.next();
1620 
1621  // Expression TODO: (n's expressions?)
1623 
1624  if(reader.getNodeType() == te::xml::VALUE)
1625  {
1626  p->m_mixedData = new std::string(reader.getElementValue());
1627  reader.next();
1628  }
1629  else
1630  {
1632  }
1633 
1634  svgParam->add(p);
1635 
1636  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1637  reader.next();
1638 
1639  return svgParam.release();
1640 }
1641 
1643 {
1644  if(p == 0)
1645  return;
1646 
1647  writer.writeStartElement("se:SvgParameter");
1648 
1649  writer.writeAttribute("name", p->getName());
1650 
1651  Save(static_cast<const te::se::ParameterValue*>(p), writer);
1652 
1653  writer.writeEndElement("se:SvgParameter");
1654 }
1655 
1656 //#endif
const ParameterValue * getRotation() const
Definition: Graphic.cpp:131
ParameterValue * getValue() const
int getMarkIndex() const
Definition: Mark.cpp:103
bool isAligned() const
A selected channel to be display.
const SvgParameter * getLineCap() const
Definition: Stroke.cpp:143
const ParameterValue * getDisplacementX() const
const AnchorPoint * getAnchorPoint() const
ContrastEnhancementType
The type of contrast enhancement.
A Description gives human-readable descriptive information for the object it is included within...
Definition: Description.h:56
const ParameterValue * getRadius() const
Definition: Halo.cpp:49
The transformation of continuous values to distinct values (Categorize function). ...
Definition: Categorize.h:90
bool hasElseFilter() const
Definition: Rule.cpp:113
double getReliefFactor() const
A Mark specifies a geometric shape and applies coloring to it.
Definition: Mark.h:84
This class models a XML reader object.
Definition: Reader.h:55
TESEEXPORT te::se::InterpolationPoint * ReadInterpolationPoint(te::xml::Reader &reader)
Interpolate * getInterpolate() const
Definition: ColorMap.cpp:75
A Displacement gives X and Y offset displacements to use for rendering a text label, graphic or other Symbolizer near a point.
Definition: Displacement.h:58
A LinePlacement specifies how a text label should be rendered relative to a linear geometry...
Definition: LinePlacement.h:61
The LabelPlacement specifies where and how a text label should be rendered relative to a geometry...
const std::vector< ExternalGraphic * > getExternalGraphics() const
Definition: Graphic.cpp:76
const std::string & getTitle() const
Definition: Description.cpp:42
const std::string & getFallbackValue() const
Definition: Function.cpp:42
virtual void writeStartElement(const std::string &qName)=0
const ParameterValue * getGap() const
const Displacement * getDisplacement() const
TESEEXPORT te::se::SvgParameter * ReadSvgParameter(te::xml::Reader &reader)
te::fe::Expression * m_expression
Parameter from an expression.
virtual void writeValue(const std::string &value)=0
const double & getMinScaleDenominator() const
Definition: Rule.cpp:123
const SvgParameter * getLineJoin() const
Definition: Stroke.cpp:138
bool isBrightnessOnly() const
const ParameterValue * getInitialGap() const
TEFEEXPORT te::fe::Filter * ReadFilter(te::xml::Reader &reader)
Definition: Filter.cpp:37
ThresholdsBelongToType
It controls the interval order.
Definition: Categorize.h:99
const SvgParameter * getFamily() const
Definition: Font.cpp:85
std::string * m_mixedData
Parameter from a mixed data content.
ParameterValue * getLookupValue() const
Definition: Interpolate.h:149
const std::vector< InterpolationPoint * > & getInterpolationPoints() const
Definition: Interpolate.cpp:91
const std::string & getAbstract() const
Definition: Description.cpp:52
bool isRepeated() const
Definition: LinePlacement.h:89
SelectedChannel * getRedChannel() const
TESEEXPORT te::se::GraphicStroke * ReadGraphicStroke(te::xml::Reader &reader)
const std::string & getData() const
const ThresholdsBelongToType & getThresholdsBelongTo() const
Definition: Categorize.h:147
TESEEXPORT te::se::ContrastEnhancement * ReadContrastEnhancement(te::xml::Reader &reader)
SelectedChannel * getBlueChannel() const
void setDashOffset(const std::string &offset)
Definition: Stroke.cpp:118
const te::fe::Filter * getFilter() const
Definition: Rule.cpp:97
const ParameterValue * getRotation() const
This class models a XML writer object.
A Graphic is a graphic symbol with an inherent shape, color(s), and possibly size.
Definition: Graphic.h:66
const SvgParameter * getWeight() const
Definition: Font.cpp:95
The transformation of continuous values to a number of values (Interpolate function).
Definition: Interpolate.h:88
const MethodType & geMethodType() const
Definition: Interpolate.h:159
const AnchorPoint * getAnchorPoint() const
Definition: Graphic.cpp:142
TESEEXPORT te::se::Fill * ReadFill(te::xml::Reader &reader)
TESEEXPORT te::se::Halo * ReadHalo(te::xml::Reader &reader)
InlineContent is XML- or base64-encoded encoded content in some externally-defined format that is inc...
Definition: InlineContent.h:51
The "ParameterValueType" uses WFS-Filter expressions to give values for SE graphic parameters...
void WriteStringPtrHelper(const std::string &elementName, const std::string *s, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:42
const std::string * getFormat() const
Definition: Mark.cpp:93
TESEEXPORT te::se::Mark * ReadMark(te::xml::Reader &reader)
TESEEXPORT te::se::ParameterValue * ReadParameterValue(te::xml::Reader &reader)
const ParameterValue * getGap() const
Definition: LinePlacement.h:97
An AnchorPoint identifies the location inside of a text label to use an 'anchor' for positioning it r...
Definition: AnchorPoint.h:63
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
std::string getSourceChannelName() const
const ParameterValue * getDisplacementY() const
TESEEXPORT te::se::Stroke * ReadStroke(te::xml::Reader &reader)
const std::vector< ParameterValue * > & getThresholds() const
Definition: Categorize.cpp:109
const SvgParameter * getSize() const
Definition: Font.cpp:100
const Parameter * getParameter(size_t i) const
const te::xl::SimpleLink * getOnlineResource() const
TESEEXPORT te::se::Categorize * ReadCategorize(te::xml::Reader &reader)
A PointPlacement specifies how a text label should be rendered relative to a geometric point...
TESEEXPORT RasterSymbolizer::OverlapBehavior ReadOverlapBehavior(te::xml::Reader &reader)
virtual void writeElement(const std::string &qName, const std::string &value)=0
The ExternalGraphic allows a reference to be made to an external graphic file with a Web URL or to in...
const SvgParameter * getOpacity() const
Definition: Stroke.cpp:128
TESEEXPORT te::se::Interpolate * ReadInterpolate(te::xml::Reader &reader)
OverlapBehavior
OverlapBehavior tells a system how to behave when multiple raster images in a layer overlap each othe...
const Graphic * getGraphicFill() const
Gets the GraphicFill element associate to this Stroke.
Definition: Stroke.cpp:63
static T & getInstance()
It returns a reference to the singleton instance.
Definition: Singleton.h:120
virtual double getElementValueAsDouble() const
It returns the element data value in the case of VALUE node.
Definition: Reader.cpp:37
TESEEXPORT te::se::ExternalGraphic * ReadExternalGraphic(te::xml::Reader &reader)
TESEEXPORT te::se::Displacement * ReadDisplacement(te::xml::Reader &reader)
const SvgParameter * getColor() const
Definition: Stroke.cpp:123
const Graphic * getGraphicFill() const
Gets the GraphicFill element associate to this Fill.
Definition: Fill.cpp:52
ModeType
It controls the ...
Definition: Interpolate.h:97
const GraphicStroke * getGraphicStroke() const
Gets the GraphicStroke element associate to this Stroke.
Definition: Stroke.cpp:74
ParameterValue * getLookupValue() const
Definition: Categorize.h:135
EncodingType getEncoding() const
ContrastEnhancement defines the 'stretching' of contrast for a channel of a false-color image or for ...
const InlineContent * getInlineContent() const
MethodType
It controls the ...
Definition: Interpolate.h:109
TEDATAACCESSEXPORT void Save(const std::string &fileName)
Definition: Serializer.cpp:201
A Font specifies the text font to use in a text symbolizer.
Definition: Font.h:63
Auxiliary classes and functions to serialize Symbolizer informations from a XML document.
ColorCompositionType getColorCompositionType() const
Utility methods for the Symbology serialization.
size_t getNParameters() const
void WriteOnlineResourceHelper(const te::xl::SimpleLink *link, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:67
ImageOutline specifies how individual source rasters in a multi-raster set (such as a set of satellit...
Definition: ImageOutline.h:53
A Fill specifies the pattern for filling an area geometry.
Definition: Fill.h:59
const ParameterValue * getAnchorPointX() const
Definition: AnchorPoint.cpp:48
std::string getName() const
const std::string * getWellKnownName() const
Definition: Mark.cpp:60
const std::string & getFormat() const
virtual std::string getAttr(const std::string &name) const =0
It returns the attribute value in the case of an element node with valid attributes.
TESEEXPORT te::se::SelectedChannel * ReadSelectedChannel(te::xml::Reader &reader)
TESEEXPORT void Save(const te::se::AnchorPoint *ap, te::xml::AbstractWriter &writer)
const Stroke * getStroke() const
Definition: Mark.cpp:125
ParameterValue * getValue() const
Definition: Categorize.h:139
TESEEXPORT te::se::ColorMap * ReadColorMap(te::xml::Reader &reader)
virtual bool getElementValueAsBoolean() const
It returns the element data value in the case of VALUE node.
Definition: Reader.cpp:42
TESEEXPORT te::se::LabelPlacement * ReadLabelPlacement(te::xml::Reader &reader)
TESEEXPORT te::se::InlineContent * ReadInlineContent(te::xml::Reader &reader)
const std::vector< Symbolizer * > & getSymbolizers() const
Definition: Rule.cpp:158
const te::xl::SimpleLink * getOnlineResource() const
Definition: Mark.cpp:71
ContrastEnhancementType getContrastEnhancementType() const
const ParameterValue * getInitialGap() const
Definition: LinePlacement.h:93
InlineContent * getInlineContent() const
Definition: Mark.cpp:82
SelectedChannel * getGreenChannel() const
const Displacement * getDisplacement() const
Definition: Graphic.cpp:153
Data serialization for the Symbology Encoder module.
virtual void writeAttribute(const std::string &attName, const std::string &value)=0
TESEEXPORT te::se::LinePlacement * ReadLinePlacement(te::xml::Reader &reader)
ContrastEnhancement * getContrastEnhancement() const
const std::vector< Mark * > getMarks() const
Definition: Graphic.cpp:98
const LinePlacement * getLinePlacement() const
const SvgParameter * getDashArray() const
Definition: Stroke.cpp:148
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
Definition: Rule.h:78
EncodingType
The format type of encoded data.
Definition: InlineContent.h:60
They are used to define a graph of points.
A Stroke specifies the appearance of a linear geometry.
Definition: Stroke.h:67
TESEEXPORT te::se::ChannelSelection * ReadChannelSelection(te::xml::Reader &reader)
virtual NodeType getNodeType() const =0
It return the type of node read.
TESEEXPORT te::se::PointPlacement * ReadPointPlacement(te::xml::Reader &reader)
const Fill * getFill() const
Definition: Halo.cpp:60
TEFEEXPORT void Save(const te::fe::Filter *filter, te::xml::AbstractWriter &writer)
Definition: Filter.cpp:54
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
Categorize * getCategorize() const
Definition: ColorMap.cpp:64
TESEEXPORT te::se::ImageOutline * ReadImageOutline(te::xml::Reader &reader)
const SvgParameter * getStyle() const
Definition: Font.cpp:90
virtual void writeEndElement(const std::string &qName)=0
const ParameterValue * getAnchorPointY() const
Definition: AnchorPoint.cpp:59
TESEEXPORT te::se::Font * ReadFont(te::xml::Reader &reader)
const double & getMaxScaleDenominator() const
Definition: Rule.cpp:133
const SvgParameter * getColor() const
Definition: Fill.cpp:76
A SvgParameter refers to an SVG/CSS graphical-formatting parameter.
Definition: SvgParameter.h:48
const ModeType & getModeType() const
Definition: Interpolate.h:155
TESEEXPORT te::se::Rule * ReadRule(te::xml::Reader &reader)
void WriteParameterValuePtrHelper(const std::string &elementName, const te::se::ParameterValue *p, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:47
const Description * getDescription() const
Definition: Rule.cpp:75
TESEEXPORT te::se::Description * ReadDescription(te::xml::Reader &reader)
virtual bool hasAttrs() const =0
It tells if the element has attributes in the case of an element node.
Symbolizer * getSymbolizer() const
SelectedChannel * getGrayChannel() const
A Halo is a type of Fill that is applied to the backgrounds of font glyphs.
Definition: Halo.h:64
const PointPlacement * getPointPlacement() const
virtual bool next()=0
It gets the next event to be read.
const ParameterValue * getPerpendicularOffset() const
Definition: LinePlacement.h:85
const ParameterValue * getSize() const
Definition: Graphic.cpp:120
A ColorMap defines either the colors of a pallette-type raster source or the mapping of numeric pixel...
Definition: ColorMap.h:60
ShadedRelief specifies the application of relief shading (or "hill shading") to a DEM raster to give ...
Definition: ShadedRelief.h:58
const Graphic * getGraphic() const
const Graphic * getLegendGraphic() const
Definition: Rule.cpp:86
TESEEXPORT te::se::Graphic * ReadGraphic(te::xml::Reader &reader)
A GraphicStroke defines a repeated-linear graphic pattern to be used for stroking a line...
Definition: GraphicStroke.h:50
TESEEXPORT te::se::ShadedRelief * ReadShadedRelief(te::xml::Reader &reader)
const std::vector< ParameterValue * > & getThresholdValues() const
Definition: Categorize.cpp:114
const SvgParameter * getWidth() const
Definition: Stroke.cpp:133
void WriteSelectedChannelHelper(const std::string &elementName, const te::se::SelectedChannel *sc, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:123
bool getGeneralizeLine() const
const Fill * getFill() const
Definition: Mark.cpp:114
const SvgParameter * getOpacity() const
Definition: Fill.cpp:81
ChannelSelection specifies the false-color channel selection for a multi-spectral raster source (such...
TESEEXPORT te::se::AnchorPoint * ReadAnchorPoint(te::xml::Reader &reader)
const ParameterValue * getOpacity() const
Definition: Graphic.cpp:109
const std::string * getName() const
Definition: Rule.cpp:64