24 #include <QStringList>
30 #include <QSvgRenderer>
39 #define M_PI 3.14159265358979323846
42 #define DEG2RAD(x) ((x)*M_PI/180)
59 mList.append(
"hard:circle" );
60 mList.append(
"hard:rectangle" );
61 mList.append(
"hard:diamond" );
62 mList.append(
"hard:pentagon" );
63 mList.append(
"hard:cross" );
64 mList.append(
"hard:cross2" );
65 mList.append(
"hard:triangle" );
66 mList.append(
"hard:equilateral_triangle" );
67 mList.append(
"hard:star" );
68 mList.append(
"hard:regular_star" );
69 mList.append(
"hard:arrow" );
73 QgsDebugMsg( QString(
"Application SVG Search paths: \n%1" ).arg( svgPaths.join(
"\n" ) ) );
75 for (
int i = 0; i < svgPaths.size(); i++ )
77 QDir dir( svgPaths[i] );
78 foreach( QString item, dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot ) )
80 svgPaths.insert( i + 1, dir.path() +
"/" + item );
83 QgsDebugMsg( QString(
"Looking for svgs in %1" ).arg( dir.path() ) );
85 foreach( QString item, dir.entryList( QStringList(
"*.svg" ), QDir::Files ) )
88 mList.append(
"svg:" + dir.path() +
"/" + item );
106 if ( !QgsMarkerCatalogue::mMarkerCatalogue )
123 if ( fullName.startsWith(
"hard:" ) )
125 int pw = (( pen.width() == 0 ? 1 : pen.width() ) + 1 ) / 2 * 2;
126 imageSize = (( int ) size + pw ) / 2 * 2 + 1;
127 myImage = QImage( imageSize, imageSize, QImage::Format_ARGB32_Premultiplied );
134 imageSize = (( int ) size ) / 2 * 2 + 1;
135 myImage = QImage( imageSize, imageSize, QImage::Format_ARGB32_Premultiplied );
142 myPainter.begin( &myImage );
143 myPainter.setRenderHint( QPainter::Antialiasing );
144 myPainter.setOpacity( opacity );
149 if ( fullName.startsWith(
"svg:" ) )
151 if (
svgMarker( &myPainter, fullName.mid( 4 ), size ) )
154 QgsDebugMsg( QString(
"%1 not found - replacing with hard:circle" ).arg( fullName ) );
155 fullName =
"hard:circle";
158 if ( fullName.startsWith(
"font:" ) )
160 if (
fontMarker( &myPainter, fullName.mid( 5 ), size ) )
163 QgsDebugMsg( QString(
"%1 not found - replacing with hard:circle" ).arg( fullName ) );
164 fullName =
"hard:circle";
167 if ( fullName.endsWith(
".svg", Qt::CaseInsensitive ) )
169 if (
svgMarker( &myPainter, fullName, size ) )
172 QgsDebugMsg( QString(
"%1 not found - replacing with hard:circle" ).arg( fullName ) );
173 fullName =
"hard:circle";
176 if ( fullName.startsWith(
"hard:" ) )
178 hardMarker( &myPainter, imageSize, fullName.mid( 5 ), size, pen, brush );
180 QgsDebugMsg(
"*** Saving hard marker to hardMarker.png ***" );
182 myImage.save(
"hardMarker.png" );
198 if ( fullName.left( 5 ) ==
"hard:" )
202 myPicture = QPicture( size + 1 );
208 if ( size < 1 ) size = 1;
209 myPicture = QPicture( size );
212 QPainter myPainter( &myPicture );
213 myPainter.setRenderHint( QPainter::Antialiasing );
214 myPainter.setOpacity( opacity );
219 if ( fullName.left( 4 ) ==
"svg:" )
221 if (
svgMarker( &myPainter, fullName.mid( 4 ), size ) )
224 QgsDebugMsg( QString(
"%1 not found - replacing with hard:circle" ).arg( fullName ) );
225 fullName =
"hard:circle";
228 if ( fullName.left( 5 ) ==
"hard:" )
230 hardMarker( &myPainter, (
int ) size, fullName.mid( 5 ), size, pen, brush );
239 QStringList args = fullName.split(
"," );
240 if ( args.size() == 0 )
245 if ( args.size() > 0 )
247 if ( args[0] ==
"#" )
251 else if ( args[0].startsWith(
"#" ) )
253 c = QChar( args[0].mid( 1 ).toInt() );
261 QString family = args.size() >= 2 ? args[1] :
"Helvetica";
262 int weight = args.size() >= 3 ? args[2].toInt() : -1;
263 int italic = args.size() >= 4 ? args[3].toInt() != 0 :
false;
265 thepPainter->setFont( QFont( family, scaleFactor, weight, italic ) );
266 thepPainter->drawText( 0, 0, c );
274 if ( !mySVG.load( fileName ) )
277 mySVG.render( thepPainter );
288 s = s - pen.widthF();
300 double x_c = ( double )( imageSize / 2 ) + 0.5;
303 thepPainter->setPen( pen );
304 thepPainter->setBrush( brush );
308 if ( name ==
"circle" )
313 thepPainter->drawEllipse( QRectF( x_c - r, y_c - r, s, s ) );
315 else if ( name ==
"rectangle" )
317 thepPainter->drawRect( QRectF( x_c - r, y_c - r, s, s ) );
319 else if ( name ==
"diamond" )
322 pa << QPointF( x_c - r, y_c )
323 << QPointF( x_c, y_c + r )
324 << QPointF( x_c + r, y_c )
325 << QPointF( x_c, y_c - r );
326 thepPainter->drawPolygon( pa );
328 else if ( name ==
"pentagon" )
331 pa << QPointF( x_c + ( r * sin(
DEG2RAD( 288.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 288.0 ) ) ) )
332 << QPointF( x_c + ( r * sin(
DEG2RAD( 216.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 216.0 ) ) ) )
333 << QPointF( x_c + ( r * sin(
DEG2RAD( 144.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 144.0 ) ) ) )
334 << QPointF( x_c + ( r * sin(
DEG2RAD( 72.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 72.0 ) ) ) )
335 << QPointF( x_c, y_c - r );
336 thepPainter->drawPolygon( pa );
338 else if ( name ==
"cross" )
340 thepPainter->drawLine( QPointF( x_c - r, y_c ), QPointF( x_c + r, y_c ) );
341 thepPainter->drawLine( QPointF( x_c, y_c - r ), QPointF( x_c, y_c + r ) );
343 else if ( name ==
"cross2" )
345 thepPainter->drawLine( QPointF( x_c - r, y_c - r ), QPointF( x_c + r, y_c + r ) );
346 thepPainter->drawLine( QPointF( x_c - r, y_c + r ), QPointF( x_c + r, y_c - r ) );
348 else if ( name ==
"triangle" )
351 pa << QPointF( x_c - r, y_c + r )
352 << QPointF( x_c + r, y_c + r )
353 << QPointF( x_c, y_c - r );
354 thepPainter->drawPolygon( pa );
356 else if ( name ==
"equilateral_triangle" )
359 pa << QPointF( x_c + ( r * sin(
DEG2RAD( 240.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 240.0 ) ) ) )
360 << QPointF( x_c + ( r * sin(
DEG2RAD( 120.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 120.0 ) ) ) )
361 << QPointF( x_c, y_c - r );
362 thepPainter->drawPolygon( pa );
364 else if ( name ==
"star" )
366 double oneSixth = 2 * r / 6;
369 pa << QPointF( x_c, y_c - r )
370 << QPointF( x_c - oneSixth, y_c - oneSixth )
371 << QPointF( x_c - r, y_c - oneSixth )
372 << QPointF( x_c - oneSixth, y_c )
373 << QPointF( x_c - r, y_c + r )
374 << QPointF( x_c, y_c + oneSixth )
375 << QPointF( x_c + r, y_c + r )
376 << QPointF( x_c + oneSixth, y_c )
377 << QPointF( x_c + r, y_c - oneSixth )
378 << QPointF( x_c + oneSixth, y_c - oneSixth );
379 thepPainter->drawPolygon( pa );
381 else if ( name ==
"regular_star" )
384 double inner_r = r * cos(
DEG2RAD( 72.0 ) ) / cos(
DEG2RAD( 36.0 ) );
387 pa << QPointF( x_c + ( inner_r * sin(
DEG2RAD( 324.0 ) ) ), y_c - ( inner_r * cos(
DEG2RAD( 324.0 ) ) ) )
388 << QPointF( x_c + ( r * sin(
DEG2RAD( 288.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 288 ) ) ) )
389 << QPointF( x_c + ( inner_r * sin(
DEG2RAD( 252.0 ) ) ), y_c - ( inner_r * cos(
DEG2RAD( 252.0 ) ) ) )
390 << QPointF( x_c + ( r * sin(
DEG2RAD( 216.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 216.0 ) ) ) )
391 << QPointF( x_c, y_c + ( inner_r ) )
392 << QPointF( x_c + ( r * sin(
DEG2RAD( 144.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 144.0 ) ) ) )
393 << QPointF( x_c + ( inner_r * sin(
DEG2RAD( 108.0 ) ) ), y_c - ( inner_r * cos(
DEG2RAD( 108.0 ) ) ) )
394 << QPointF( x_c + ( r * sin(
DEG2RAD( 72.0 ) ) ), y_c - ( r * cos(
DEG2RAD( 72.0 ) ) ) )
395 << QPointF( x_c + ( inner_r * sin(
DEG2RAD( 36.0 ) ) ), y_c - ( inner_r * cos(
DEG2RAD( 36.0 ) ) ) )
396 << QPointF( x_c, y_c - r );
397 thepPainter->drawPolygon( pa );
399 else if ( name ==
"arrow" )
401 double oneEight = r / 4;
402 double quarter = r / 2;
405 pa << QPointF( x_c, y_c - r )
406 << QPointF( x_c + quarter, y_c - quarter )
407 << QPointF( x_c + oneEight, y_c - quarter )
408 << QPointF( x_c + oneEight, y_c + r )
409 << QPointF( x_c - oneEight, y_c + r )
410 << QPointF( x_c - oneEight, y_c - quarter )
411 << QPointF( x_c - quarter, y_c - quarter );
412 thepPainter->drawPolygon( pa );