source: proto/gml2svg/C/xerces/gml2svg_handler.cpp @ 1703

Last change on this file since 1703 was 1703, checked in by ksherdy, 8 years ago

Added gml2svg prototypes.

  • Property svn:executable set to *
File size: 19.1 KB
Line 
1/*
2 sax2_gml2svg_handler.cpp - GML2SVG
3 Copyright (C) 2007, 2008 Ken Herdy
4 Version 0.9
5 Licensed to the public under the Open Software License 3.0.
6 */
7
8#ifndef SAX2_GML2SVG_HANDLER_CPP_
9#define SAX2_GML2SVG_HANDLER_CPP_
10
11#include "gml2svg_handler.hpp"
12#include <gml2svg/constants.h>
13#include <gml2svg/util.h>
14#include <gml2svg/vancouver_constants.h>
15#include <style_ext/style_ext.h>
16#include <stdio.h>
17#include <float.h>
18
19#include <iostream>
20using namespace std;
21
22GML2SVGHandler::GML2SVGHandler() {
23        this->_out_buf = NULL;
24        this->_out_buf_pos = 0;
25
26        // Copy and type cast defaults
27        this->_crt_decimal = DEFAULT_DECIMAL;
28        this->_crt_cs = DEFAULT_CS;
29        this->_crt_ts = DEFAULT_TS;
30
31        this->_xmlch_APP_NS_URI = XMLString::transcode(APP_NS_URI);
32        this->_xmlch_GML_NS_URI = XMLString::transcode(GML_NS_URI);
33        this->_xmlch_GML_COORDINATES_LNAME = XMLString::transcode(GML_COORDINATES_LNAME);
34        this->_xmlch_CS_LOCAL_NAME = XMLString::transcode(CS_LOCAL_NAME);
35        this->_xmlch_DECIMAL_LOCAL_NAME = XMLString::transcode(DECIMAL_LOCAL_NAME);
36        this->_xmlch_TS_LOCAL_NAME = XMLString::transcode(TS_LOCAL_NAME);
37
38        this->_width = NULL;
39        this->_height = NULL;
40        this->_sum_y = 0.0;
41        this->_scale_x = 0.0;
42        this->_scale_y = 0.0;
43        this->_x1 = 0.0;
44        this->_y1 = 0.0;
45        this->_x2 = 0.0;
46        this->_y2 = 0.0;
47
48        this->_style_string = NULL;
49        this->_feature_id = NULL;
50
51        this->_in_feature = false;
52        this->_in_geometry = false;
53        this->_in_gml_coordinates = false;
54
55        this->_coordinates_buffer.clear();
56
57}
58
59GML2SVGHandler::~GML2SVGHandler() {
60        this->freeMembers();
61
62        if(this->_xmlch_APP_NS_URI) {
63                XMLString::release(&(this->_xmlch_APP_NS_URI));
64        }
65
66        if(this->_xmlch_GML_NS_URI) {
67                XMLString::release(&(this->_xmlch_GML_NS_URI));
68        }
69
70        if (this->_xmlch_GML_COORDINATES_LNAME) {
71                XMLString::release(&(this->_xmlch_GML_COORDINATES_LNAME));
72        }
73
74        if (this->_xmlch_CS_LOCAL_NAME) {
75                XMLString::release(&(this->_xmlch_CS_LOCAL_NAME));
76        }
77
78        if (this->_xmlch_DECIMAL_LOCAL_NAME) {
79                XMLString::release(&(this->_xmlch_DECIMAL_LOCAL_NAME));
80        }
81
82        if (this->_xmlch_TS_LOCAL_NAME) {
83                XMLString::release(&(this->_xmlch_TS_LOCAL_NAME));
84        }
85}
86
87// ---------------------------------------------------------------------------
88//  GML2SVGHandler: Implementation of the SAX DocumentHandler interface
89// ---------------------------------------------------------------------------
90
91void GML2SVGHandler::startDocument() {
92
93        this->_in_feature = false;
94        this->_in_geometry = false;
95        this->_in_gml_coordinates = false;
96
97        this->_coordinates_buffer.clear();
98
99        #if defined(NAIVE_FORMATTED_IO)
100
101                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
102                                // SVG
103                                ,SVG_START_ELEMENT
104                                ,SPACE
105                                ,XML_NAMESPACE_ATTR
106                                ,EQUALS
107                                ,DQUOTE
108                                ,SVG_NAMESPACE_VALUE
109                                ,DQUOTE
110                                ,SPACE
111                                ,SVG_WIDTH_ATTR
112                                ,EQUALS
113                                ,DQUOTE
114                                ,this->_width
115                                ,DQUOTE
116                                ,SPACE
117                                ,SVG_HEIGHT_ATTR
118                                ,EQUALS
119                                ,DQUOTE
120                                ,this->_height
121                                ,DQUOTE
122                                ,RANGLE);
123
124        #elif defined(FORMATTED_IO)
125                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"%s\" height=\"%s\">", this->_width, this->_height);
126
127        #elif defined(MEMCPY_IO)
128                memcpy(this->_out_buf + this->_out_buf_pos,
129                                "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"",
130                                sizeof("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"")-1);
131                this->_out_buf_pos
132                                += sizeof("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"")-1;
133
134                memcpy(this->_out_buf + this->_out_buf_pos, this->_width,
135                                strlen(this->_width));
136                this->_out_buf_pos += strlen(this->_width);
137
138                memcpy(this->_out_buf + this->_out_buf_pos, "\" height=\"",
139                                sizeof("\" height=\"")-1);
140                this->_out_buf_pos += sizeof("\" height=\"")-1;
141
142                memcpy(this->_out_buf + this->_out_buf_pos, this->_height,
143                                strlen(this->_height));
144                this->_out_buf_pos += strlen(this->_height);
145
146                memcpy(this->_out_buf + this->_out_buf_pos, "\">", sizeof("\">")-1);
147                this->_out_buf_pos += sizeof("\">")-1;
148
149        #endif
150
151        #if defined(WORLD2SCREEN)  // g
152
153                #if defined(NAIVE_FORMATTED_IO)
154                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s%s%s%s%s%s%s"
155                                                ,G_START_ELEMENT
156                                                ,SPACE
157                                                ,PATH_STYLE_ATTR
158                                                ,EQUALS
159                                                ,DQUOTE
160                                                ,this->_style_string
161                                                ,DQUOTE
162                                                ,RANGLE);
163
164                #elif defined(FORMATTED_IO)
165                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"<g style=\"%s\">",this->_style_string);
166
167                #elif defined(MEMCPY_IO)
168                                memcpy(this->_out_buf + this->_out_buf_pos, "<g style=\"",
169                                                sizeof("<g style=\"")-1);
170                                this->_out_buf_pos += sizeof("<g style=\"")-1;
171
172                                memcpy(this->_out_buf + this->_out_buf_pos, this->_style_string, strlen(this->_style_string));
173                                this->_out_buf_pos += strlen(this->_style_string);
174
175                                memcpy(this->_out_buf + this->_out_buf_pos, "\">", sizeof("\">")-1);
176                                this->_out_buf_pos += sizeof("\">")-1;
177
178                                /* BUFFERED_IO
179                                 fwrite(this->_out_buf, 1, this->_out_buf_pos, this->_out_file);
180                                 fflush(this->_out_file);
181                                 this->_out_buf_pos = 0;
182                                 */
183
184                #endif
185
186        #else
187                char * scale_x = new char [DBL_DIG + DBL_MANT_DIG + 1];
188                char * scale_y = new char [DBL_DIG + DBL_MANT_DIG + 1];
189                char * x1 = new char [DBL_DIG + DBL_MANT_DIG + 1];
190                char * y2 = new char [DBL_DIG + DBL_MANT_DIG + 1];
191
192                #if defined(NAIVE_FORMATTED_IO)
193                                // Reduce %5.17f to %5.5f to optimize
194                                sprintf(scale_x,SCALE_FORMAT, this->_scale_x);
195                                sprintf(scale_y,SCALE_FORMAT, this->_scale_y * -1.0);
196                                sprintf(x1,"%f", this->_x1 * -1.0);
197                                sprintf(y2,"%f", this->_y2 * -1.0);
198
199                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
200                                                ,G_START_ELEMENT
201                                                ,SPACE
202                                                ,G_TRANSFORM_ATTR
203                                                ,EQUALS
204                                                ,DQUOTE
205                                                ,SCALE
206                                                ,LROUND
207                                                ,scale_x
208                                                ,COMMA
209                                                ,scale_y
210                                                ,RROUND
211                                                ,SPACE
212                                                ,TRANSLATE
213                                                ,LROUND
214                                                ,x1
215                                                ,COMMA
216                                                ,y2
217                                                ,RROUND
218                                                ,DQUOTE
219                                                ,SPACE
220                                                ,PATH_STYLE_ATTR
221                                                ,EQUALS
222                                                ,DQUOTE
223                                                ,this->_style_string
224                                                ,DQUOTE
225                                                ,RANGLE);
226
227                #elif defined(FORMATTED_IO)
228                                sprintf(scale_x,SCALE_FORMAT, this->_scale_x);
229                                sprintf(scale_y,SCALE_FORMAT, this->_scale_y * -1.0);
230                                sprintf(x1,"%f", this->_x1 * -1.0);
231                                sprintf(y2,"%f", this->_y2 * -1.0);
232
233                                this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"<g transform=\"scale(%s,%s) translate(%s,%s)\" style=\"%s\">",scale_x,scale_y,x1,y2,this->_style_string);
234
235                #elif defined(MEMCPY_IO)
236                                sprintf(scale_x, SCALE_FORMAT, this->_scale_x);
237                                sprintf(scale_y, SCALE_FORMAT, this->_scale_y * -1.0);
238                                sprintf(x1, "%f", this->_x1 * -1.0);
239                                sprintf(y2, "%f", this->_y2 * -1.0);
240
241                                memcpy(this->_out_buf + this->_out_buf_pos, "<g transform=\"scale(",
242                                                sizeof("<g transform=\"scale(")-1);
243                                this->_out_buf_pos += sizeof("<g transform=\"scale(")-1;
244
245                                memcpy(this->_out_buf + this->_out_buf_pos, scale_x, strlen(scale_x));
246                                this->_out_buf_pos += strlen(scale_x);
247
248                                memcpy(this->_out_buf + this->_out_buf_pos, ",", sizeof(",")-1);
249                                this->_out_buf_pos += sizeof(",")-1;
250
251                                memcpy(this->_out_buf + this->_out_buf_pos, scale_y, strlen(scale_y));
252                                this->_out_buf_pos += strlen(scale_y);
253
254                                memcpy(this->_out_buf + this->_out_buf_pos, ") translate(",
255                                                sizeof(") translate(")-1);
256                                this->_out_buf_pos += sizeof(") translate(")-1;
257
258                                memcpy(this->_out_buf + this->_out_buf_pos, x1, strlen(x1));
259                                this->_out_buf_pos += strlen(x1);
260
261                                memcpy(this->_out_buf + this->_out_buf_pos, ",", sizeof(",")-1);
262                                this->_out_buf_pos += sizeof(",")-1;
263
264                                memcpy(this->_out_buf + this->_out_buf_pos, y2, strlen(y2));
265                                this->_out_buf_pos += strlen(y2);
266
267                                memcpy(this->_out_buf + this->_out_buf_pos, ")\" style=\"",
268                                                sizeof(")\" style=\"")-1);
269                                this->_out_buf_pos += sizeof(")\" style=\"")-1;
270
271                                memcpy(this->_out_buf + this->_out_buf_pos, this->_style_string,
272                                                strlen(this->_style_string));
273                                this->_out_buf_pos += strlen(this->_style_string);
274
275                                memcpy(this->_out_buf + this->_out_buf_pos, "\">", sizeof("\">")-1);
276                                this->_out_buf_pos += sizeof("\">")-1;
277
278                        delete [] scale_x;
279                        delete [] scale_y;
280                        delete [] x1;
281                        delete [] y2;
282                #endif
283        #endif
284
285}
286
287void GML2SVGHandler::endDocument() {
288
289#if defined(NAIVE_FORMATTED_IO)
290        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s%s",G_END_ELEMENT
291                        ,SVG_END_ELEMENT);
292#elif defined(FORMATTED_IO)
293        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"</g></svg>");
294
295#elif defined(MEMCPY_IO)
296        memcpy(this->_out_buf + this->_out_buf_pos, "</g></svg>",
297                        sizeof("</g></svg>")-1);
298        this->_out_buf_pos += sizeof("</g></svg>")-1;
299
300        this->_out_buf[this->_out_buf_pos] = '\0';
301
302#endif
303}
304
305void GML2SVGHandler::startElement(const XMLCh* const uri,
306                const XMLCh* const localname, const XMLCh* const qname,
307                const Attributes& attrs) {
308        if (this->_in_feature) //van:featurelname//gml:geometry//gml:coordinates
309        {
310                if (this->_in_geometry) {
311
312                        if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
313                                (XMLString::compareString(this->_xmlch_GML_COORDINATES_LNAME, localname) == 0)) {
314
315                                #if defined(GML2SVG_DEBUG)
316                                        cout << "in_coordinates" << endl;
317                                #endif
318
319                                this->_in_gml_coordinates = true;
320
321                                const XMLCh* xmlch_name;
322                                const XMLCh* xmlch_val;
323
324                                for (int i=0; i<attrs.getLength(); i++) // assumes single character wide delimeters
325                                {
326                                        xmlch_name = attrs.getLocalName(i);
327                                        if (XMLString::compareString(this->_xmlch_CS_LOCAL_NAME, xmlch_val) == 0) {
328
329                                                #if defined(GML2SVG_DEBUG)
330                                                        cout << "in_cs" << endl;
331                                                #endif
332
333                                                xmlch_val = attrs.getValue(i);
334                                                char * val = XMLString::transcode(xmlch_val);
335                                                this->_crt_cs = *val;
336                                                XMLString::release(&val);
337
338                                        } else if (XMLString::compareString( this->_xmlch_DECIMAL_LOCAL_NAME, xmlch_val) == 0) {
339
340                                                #if defined(GML2SVG_DEBUG)
341                                                        cout << "in_decimal" << endl;
342                                                #endif
343
344                                                xmlch_val = attrs.getValue(i);
345                                                char * val = XMLString::transcode(xmlch_val);
346                                                this->_crt_decimal = val[0];
347                                                XMLString::release(&val);
348
349                                        } else if (XMLString::compareString(this->_xmlch_TS_LOCAL_NAME, xmlch_val) == 0) {
350
351                                                #if defined(GML2SVG_DEBUG)
352                                                        cout << "in_ts" << endl;
353                                                #endif
354
355                                                xmlch_val = attrs.getValue(i);
356                                                char * val = XMLString::transcode(xmlch_val);
357                                                this->_crt_cs = val[0];
358                                                XMLString::release(&val);
359
360                                        }
361                                }
362                        }
363                } else {
364
365                        if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
366                                (XMLString::compareString(this->_xmlch_geometry_lname, localname) == 0)) {
367
368                                #if defined(GML2SVG_DEBUG)
369                                        cout << "in_geometry" << endl;
370                                #endif
371
372                                this->_in_geometry = true;
373                        }
374                }
375        } else {
376
377                if ((XMLString::compareString(this->_xmlch_APP_NS_URI, uri) == 0) &&
378                        (XMLString::compareString(this->_xmlch_feature_lname, localname) == 0)) {
379
380                        #if defined(GML2SVG_DEBUG)
381                                cout << "in_feature" << endl;
382                        #endif
383
384                        this->_in_feature = true;
385
386                        const XMLCh* xmlch_val;
387
388                        if ((xmlch_val = attrs.getValue(this->_xmlch_GML_NS_URI, this->_xmlch_feature_id_lname)) != 0) {
389                                char * val = XMLString::transcode(xmlch_val);
390                                strcpy(this->_feature_id, val);
391                                XMLString::release(&val);
392                        }
393                }
394        }
395}
396
397void GML2SVGHandler::characters(const XMLCh* const chars,
398                const unsigned int length) {
399        if (this->_in_gml_coordinates) {
400                this->_coordinates_buffer.push_back(XMLString::transcode(chars));
401        }
402}
403
404void GML2SVGHandler::endElement(const XMLCh* const uri,
405                const XMLCh* const localname, const XMLCh* const qname) {
406        if (this->_in_gml_coordinates) {
407
408                int buf_length = 0;
409                for (int i=0; i<this->_coordinates_buffer.size(); i++) {
410                        buf_length += strlen(this->_coordinates_buffer.at(i));
411                }
412
413                char * buf = new char[buf_length+1];
414                strcpy(buf, this->_coordinates_buffer.at(0));
415                for (int i=1; i<this->_coordinates_buffer.size(); i++) {
416                        //TODO - Implement memcpy instead of strcat for performance.
417                        strcat(buf, this->_coordinates_buffer.at(i));
418                }
419
420                if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
421                        (XMLString::compareString(this->_xmlch_GML_COORDINATES_LNAME, localname) == 0)) {
422
423#if defined(NAIVE_FORMATTED_IO)
424                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s"
425                                        ,PATH_START_ELEMENT
426                                        ,SPACE
427                                        ,PATH_ID_ATTR
428                                        ,EQUALS
429                                        ,DQUOTE
430                                        ,this->_feature_id
431                                        ,DQUOTE
432                                        ,SPACE
433                                        ,PATH_D_ATTR
434                                        ,EQUALS
435                                        ,DQUOTE);
436
437                        char * svg_path = NULL;
438                        #if defined(WORLD2SCREEN)
439
440                                coord_to_path_strtod(&this->_sum_y, &this->_scale_x, &this->_scale_y, &this->_x1, &this->_y1, this->_crt_cs, buf, buf_length, &svg_path);
441
442                        #else
443
444                                coords_to_path(this->_crt_ts, this->_crt_cs, buf, buf_length, &svg_path,0);
445
446                        #endif
447
448                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]),"%s",svg_path);
449                        delete [] svg_path;
450                        svg_path = NULL;
451
452                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
453                                        ,DQUOTE
454                                        ,SPACE
455                                        ,PATH_ONMOUSEOVER_ATTR
456                                        ,EQUALS
457                                        ,DQUOTE
458                                        ,PATH_ONMOUSEOVER_VALUE
459                                        ,DQUOTE
460                                        ,SPACE
461                                        ,PATH_ONMOUSEOUT_ATTR
462                                        ,EQUALS
463                                        ,DQUOTE
464                                        ,PATH_ONMOUSEOUT_VALUE
465                                        ,DQUOTE
466                                        ,FSLASH
467                                        ,RANGLE);
468
469#elif defined(FORMATTED_IO)
470                        char * svg_path = NULL;
471
472                        #if defined(WORLD2SCREEN)
473
474                                coord_to_path_strtod(&this->_sum_y, &this->_scale_x, &this->_scale_y, &this->_x1, &this->_y1, this->_crt_cs, buf, buf_length, &svg_path);
475
476                        #else
477
478                                coords_to_path(this->_crt_ts, this->_crt_cs, buf, buf_length, &svg_path,0);
479
480                        #endif
481
482                        this->_out_buf_pos += sprintf(&(this->_out_buf[this->_out_buf_pos]), "<path id=\"%s\" d=\"%s\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>",this->_feature_id,svg_path);
483
484                        delete [] svg_path;
485                        svg_path = NULL;
486
487#elif defined(MEMCPY_IO)
488
489                        memcpy(this->_out_buf + this->_out_buf_pos, "<path id=\"", sizeof("<path id=\"")-1);
490                        this->_out_buf_pos += sizeof("<path id=\"")-1;
491
492                        memcpy(this->_out_buf + this->_out_buf_pos, this->_feature_id, strlen(this->_feature_id));
493                        this->_out_buf_pos += strlen(this->_feature_id);
494
495                        memcpy(this->_out_buf + this->_out_buf_pos, "\" d=\"", sizeof("\" d=\"")-1);
496                        this->_out_buf_pos += sizeof("\" d=\"")-1;
497
498                        char * svg_path= NULL;
499
500                        #if defined(WORLD2SCREEN)
501
502                                coord_to_path_strtod(&this->_sum_y, &this->_scale_x, &this->_scale_y, &this->_x1, &this->_y1, this->_crt_cs, buf, buf_length, &svg_path);
503
504                        #else
505
506                                coords_to_path(this->_crt_ts, this->_crt_cs, buf, buf_length, &svg_path, 0);
507
508                        #endif
509
510                        memcpy(this->_out_buf + this->_out_buf_pos, svg_path, strlen(svg_path));
511                        this->_out_buf_pos += strlen(svg_path);
512
513                        memcpy( this->_out_buf + this->_out_buf_pos, "\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>", sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>")   -1);
514                        this->_out_buf_pos      += sizeof("\" onmouseover=\"showTooltip(evt)\" onmouseout=\"hideTooltip(evt)\"/>") -1;
515
516                        delete [] svg_path;
517                        svg_path = NULL;
518
519#endif
520
521                        delete [] buf;
522                        buf = NULL;
523
524                        this->_coordinates_buffer.clear();
525
526                        this->_crt_decimal = DEFAULT_DECIMAL;
527                        this->_crt_cs = DEFAULT_CS;
528                        this->_crt_ts = DEFAULT_TS;
529                        this->_in_gml_coordinates = false;
530                }
531        } else {
532                if (this->_in_geometry) {
533                        if ((XMLString::compareString(this->_xmlch_GML_NS_URI, uri) == 0) &&
534                                (XMLString::compareString(this->_xmlch_geometry_lname, localname) == 0)) {
535                                this->_in_geometry = false;
536                        }
537                } else {
538                        if (this->_in_feature) {
539                                if ((XMLString::compareString(this->_xmlch_APP_NS_URI, uri)     == 0) &&
540                                        (XMLString::compareString(this->_xmlch_feature_lname, localname) == 0)) {
541                                        this->_in_feature = false;
542                                        memset(this->_feature_id, '\0', strlen(this->_feature_id));
543                                }
544                        }
545                }
546        }
547}
548
549// ---------------------------------------------------------------------------
550//  GML2SVGHandler: Overrides of the SAX ErrorHandler interface
551// ---------------------------------------------------------------------------
552void GML2SVGHandler::error(const SAXParseException& e) {
553        cerr << "\nError at (file " << XMLString::transcode(e.getSystemId())
554                        << ", line " << e.getLineNumber() << ", char "
555                        << e.getColumnNumber() << "): "
556                        << XMLString::transcode(e.getMessage()) << endl;
557}
558
559void GML2SVGHandler::fatalError(const SAXParseException& e) {
560        cerr << "\nFatal Error at (file " << XMLString::transcode(e.getSystemId())
561                        << ", line " << e.getLineNumber() << ", char "
562                        << e.getColumnNumber() << "): "
563                        << XMLString::transcode(e.getMessage()) << endl;
564}
565
566void GML2SVGHandler::warning(const SAXParseException& e) {
567        cerr << "\nWarning at (file " << XMLString::transcode(e.getSystemId())
568                        << ", line " << e.getLineNumber() << ", char "
569                        << e.getColumnNumber() << "): "
570                        << XMLString::transcode(e.getMessage()) << endl;
571}
572
573// ---------------------------------------------------------------------------
574//  GML2SVGHandler: Helpers
575// ---------------------------------------------------------------------------
576void GML2SVGHandler::setOutputBuffer(char * out_buf) {
577        this->_out_buf = out_buf;
578        this->_out_buf_pos = 0;
579}
580
581int GML2SVGHandler::setParameters(const char * screen_width,
582                const char * screen_height,
583                const char * bbox,
584                const char * feature_lname,
585                const char * feature_id_lname,
586                const char * geometry_lname,
587                const char * style_string) {
588
589        int error_flag = 0;
590
591        this->freeMembers();
592
593        this->_width = new char [strlen(screen_width)+1];
594        this->_height = new char [strlen(screen_height)+1];
595        this->_style_string = new char [strlen(style_string)+1];
596        this->_feature_id = new char [FEATURE_ID_MAX_LENGTH_EST+1];
597        memset(this->_feature_id, '\0', FEATURE_ID_MAX_LENGTH_EST);
598
599        strcpy(this->_width, screen_width);
600        strcpy(this->_height, screen_height);
601
602        this->_xmlch_feature_lname = XMLString::transcode(feature_lname);
603        this->_xmlch_feature_id_lname = XMLString::transcode(feature_id_lname);
604        this->_xmlch_geometry_lname = XMLString::transcode(geometry_lname);
605
606        double temp_screen_width;
607        double temp_screen_height;
608        error_flag = strtod_wrapper(this->_width, &temp_screen_width);
609        error_flag = strtod_wrapper(this->_height, &temp_screen_height);
610        error_flag = bbox_strtod(bbox, this->_crt_cs, &this->_x1, &this->_y1,
611                        &this->_x2, &this->_y2);
612        this->_sum_y = this->_y1 + this->_y2;
613        this->_scale_x = (temp_screen_width)/(this->_x2 - this->_x1);
614        this->_scale_y= (temp_screen_height)/(this->_y2 - this->_y1);
615
616        #if defined(WORLD2SCREEN) // scale style string values
617
618                strcpy(this->_style_string, style_string);
619        #else
620                char * temp_style_string = strdup(style_string);
621                error_flag = scale_x_style_string_parameter(temp_style_string,
622                                STROKE_WIDTH, this->_scale_x, &this->_style_string);
623                free(temp_style_string);
624        #endif
625
626        return error_flag;
627}
628
629// ---------------------------------------------------------------------------
630//  GML2SVGHandler: Private Helpers
631// ---------------------------------------------------------------------------
632void GML2SVGHandler::freeMembers() {
633        if (this->_width) {
634                delete [] this->_width;
635        }
636        if (this->_height) {
637                delete [] this->_height;
638        }
639
640        if (this->_xmlch_feature_lname) {
641                XMLString::release(&(this->_xmlch_feature_lname));
642        }
643        if (this->_xmlch_feature_id_lname) {
644                XMLString::release(&(this->_xmlch_feature_id_lname));
645        }
646        if (this->_xmlch_geometry_lname) {
647                XMLString::release(&(this->_xmlch_geometry_lname));
648        }
649
650        if (this->_style_string) {
651                delete [] this->_style_string;
652        }
653        if (this->_feature_id) {
654                delete [] this->_feature_id;
655        }
656}
657
658#endif /*SAX2_GML2SVG_HANDLER_CPP_*/
Note: See TracBrowser for help on using the repository browser.