14 #include <QDomElement>
20 return QString(
"%1,%2,%3,%4" ).arg( color.red() ).arg( color.green() ).arg( color.blue() ).arg( color.alpha() );
25 QStringList lst = str.split(
"," );
26 if ( lst.count() < 3 )
30 int red, green, blue, alpha;
32 green = lst[1].toInt();
33 blue = lst[2].toInt();
35 if ( lst.count() > 3 )
37 alpha = lst[3].toInt();
39 return QColor( red, green, blue, alpha );
46 case Qt::NoPen:
return "no";
47 case Qt::SolidLine:
return "solid";
48 case Qt::DashLine:
return "dash";
49 case Qt::DotLine:
return "dot";
50 case Qt::DashDotLine:
return "dash dot";
51 case Qt::DashDotDotLine:
return "dash dot dot";
52 default:
return "???";
58 if ( str ==
"no" )
return Qt::NoPen;
59 if ( str ==
"solid" )
return Qt::SolidLine;
60 if ( str ==
"dash" )
return Qt::DashLine;
61 if ( str ==
"dot" )
return Qt::DotLine;
62 if ( str ==
"dash dot" )
return Qt::DashDotLine;
63 if ( str ==
"dash dot dot" )
return Qt::DashDotDotLine;
71 case Qt::BevelJoin:
return "bevel";
72 case Qt::MiterJoin:
return "miter";
73 case Qt::RoundJoin:
return "round";
74 default:
return "???";
80 if ( str ==
"bevel" )
return Qt::BevelJoin;
81 if ( str ==
"miter" )
return Qt::MiterJoin;
82 if ( str ==
"round" )
return Qt::RoundJoin;
90 case Qt::SquareCap:
return "square";
91 case Qt::FlatCap:
return "flat";
92 case Qt::RoundCap:
return "round";
93 default:
return "???";
99 if ( str ==
"square" )
return Qt::SquareCap;
100 if ( str ==
"flat" )
return Qt::FlatCap;
101 if ( str ==
"round" )
return Qt::RoundCap;
102 return Qt::SquareCap;
110 case Qt::SolidPattern :
return "solid";
111 case Qt::HorPattern :
return "horizontal";
112 case Qt::VerPattern :
return "vertical";
113 case Qt::CrossPattern :
return "cross";
114 case Qt::BDiagPattern :
return "b_diagonal";
115 case Qt::FDiagPattern :
return "f_diagonal";
116 case Qt::DiagCrossPattern :
return "diagonal_x";
117 case Qt::Dense1Pattern :
return "dense1";
118 case Qt::Dense2Pattern :
return "dense2";
119 case Qt::Dense3Pattern :
return "dense3";
120 case Qt::Dense4Pattern :
return "dense4";
121 case Qt::Dense5Pattern :
return "dense5";
122 case Qt::Dense6Pattern :
return "dense6";
123 case Qt::Dense7Pattern :
return "dense7";
124 case Qt::NoBrush :
return "no";
125 default:
return "???";
131 if ( str ==
"solid" )
return Qt::SolidPattern;
132 if ( str ==
"horizontal" )
return Qt::HorPattern;
133 if ( str ==
"vertical" )
return Qt::VerPattern;
134 if ( str ==
"cross" )
return Qt::CrossPattern;
135 if ( str ==
"b_diagonal" )
return Qt::BDiagPattern;
136 if ( str ==
"f_diagonal" )
return Qt::FDiagPattern;
137 if ( str ==
"diagonal_x" )
return Qt::DiagCrossPattern;
138 if ( str ==
"dense1" )
return Qt::Dense1Pattern;
139 if ( str ==
"dense2" )
return Qt::Dense2Pattern;
140 if ( str ==
"dense3" )
return Qt::Dense3Pattern;
141 if ( str ==
"dense4" )
return Qt::Dense4Pattern;
142 if ( str ==
"dense5" )
return Qt::Dense5Pattern;
143 if ( str ==
"dense6" )
return Qt::Dense6Pattern;
144 if ( str ==
"dense7" )
return Qt::Dense7Pattern;
145 if ( str ==
"no" )
return Qt::NoBrush;
146 return Qt::SolidPattern;
151 return QString(
"%1,%2" ).arg( point.x() ).arg( point.y() );
156 QStringList lst = str.split(
',' );
157 if ( lst.count() != 2 )
158 return QPointF( 0, 0 );
159 return QPointF( lst[0].toDouble(), lst[1].toDouble() );
181 else if ( str ==
"MapUnit" )
192 QString vectorString;
193 QVector<qreal>::const_iterator it = v.constBegin();
194 for ( ; it != v.constEnd(); ++it )
196 if ( it != v.constBegin() )
198 vectorString.append(
";" );
200 vectorString.append( QString::number( *it ) );
207 QVector<qreal> resultVector;
209 QStringList realList = s.split(
";" );
210 QStringList::const_iterator it = realList.constBegin();
211 for ( ; it != realList.constEnd(); ++it )
213 resultVector.append( it->toDouble() );
228 QPixmap pixmap( size );
229 pixmap.fill( Qt::transparent );
231 painter.begin( &pixmap );
232 painter.setRenderHint( QPainter::Antialiasing );
241 QPixmap pixmap( size );
242 pixmap.fill( Qt::transparent );
244 painter.begin( &pixmap );
245 painter.setRenderHint( QPainter::Antialiasing );
250 return QIcon( pixmap );
260 QPixmap pixmap( size );
262 painter.begin( &pixmap );
263 painter.setRenderHint( QPainter::Antialiasing );
264 painter.eraseRect( QRect( QPoint( 0, 0 ), size ) );
265 for (
int i = 0; i < size.width(); i++ )
267 QPen pen( ramp->
color((
double ) i / size.width() ) );
268 painter.setPen( pen );
269 painter.drawLine( i, 0, i, size.height() - 1 );
285 double x1 = p1.x(), y1 = p1.y(), x2 = p2.x(), y2 = p2.y();
287 if ( x1 == x2 && y1 == y2 )
291 t = ( x1 == x2 ? DBL_MAX : ( y2 - y1 ) / ( x2 - x1 ) );
295 angle = ( y2 > y1 ?
M_PI / 2 :
M_PI * 3 / 2 );
297 angle = ( x2 > x1 ? 0 :
M_PI );
299 angle = ( y2 > y1 ? atan( t ) :
M_PI + atan( t ) );
301 angle = ( y2 > y1 ?
M_PI + atan( t ) : atan( t ) );
309 return QPointF( pt.x() + dist * cos( angle ), pt.y() + dist * sin( angle ) );
316 if (( t1 == DBL_MAX && t2 == DBL_MAX ) || qAbs( t1 - t2 ) < 0.001 )
320 if ( t1 == DBL_MAX || t2 == DBL_MAX )
326 QPointF pSwp = p1; p1 = p2; p2 = pSwp;
327 double tSwp = t1; t1 = t2; t2 = tSwp;
335 x = (( p1.y() - p2.y() ) + t2 * p2.x() - t1 * p1.x() ) / ( t2 - t1 );
338 y = p1.y() + t1 * ( x - p1.x() );
339 return QPointF( x, y );
347 if ( polyline.count() < 2 )
350 double angle = 0.0, t_new, t_old = 0;
351 QPointF pt_old, pt_new;
352 QPointF p1 = polyline[0], p2;
353 bool first_point =
true;
355 for (
int i = 1; i < polyline.count(); i++ )
359 if ( !
lineInfo( p1, p2, angle, t_new ) )
369 if ( !pt_tmp.isNull() ) pt_new = pt_tmp;
372 newLine.append( pt_new );
382 newLine.append( pt_new );
392 QDomNode layerNode = element.firstChild();
394 while ( !layerNode.isNull() )
396 QDomElement e = layerNode.toElement();
399 if ( e.tagName() !=
"layer" )
407 layers.append( layer );
410 layerNode = layerNode.nextSibling();
413 if ( layers.count() == 0 )
419 QString symbolType = element.attribute(
"type" );
422 if ( symbolType ==
"line" )
424 else if ( symbolType ==
"fill" )
426 else if ( symbolType ==
"marker" )
430 QgsDebugMsg(
"unknown symbol type " + symbolType );
435 symbol->
setAlpha( element.attribute(
"alpha",
"1.0" ).toDouble() );
442 QString layerClass = element.attribute(
"class" );
443 bool locked = element.attribute(
"locked" ).toInt();
444 int pass = element.attribute(
"pass" ).toInt();
479 QDomElement symEl = doc.createElement(
"symbol" );
481 symEl.setAttribute(
"name", name );
483 symEl.setAttribute(
"alpha", symbol->
alpha() );
489 QDomElement layerEl = doc.createElement(
"layer" );
490 layerEl.setAttribute(
"class", layer->
layerType() );
491 layerEl.setAttribute(
"locked", layer->
isLocked() );
494 if ( subSymbols != NULL && layer->
subSymbol() != NULL )
496 QString subname = QString(
"@%1@%2" ).arg( name ).arg( i );
497 subSymbols->insert( subname, layer->
subSymbol() );
501 symEl.appendChild( layerEl );
511 QDomElement e = element.firstChildElement();
512 while ( !e.isNull() )
514 if ( e.tagName() !=
"prop" )
520 QString propKey = e.attribute(
"k" );
521 QString propValue = e.attribute(
"v" );
522 props[propKey] = propValue;
524 e = e.nextSiblingElement();
532 for ( QgsStringMap::iterator it = props.begin(); it != props.end(); ++it )
534 QDomElement propEl = doc.createElement(
"prop" );
535 propEl.setAttribute(
"k", it.key() );
536 propEl.setAttribute(
"v", it.value() );
537 element.appendChild( propEl );
546 QDomElement e = element.firstChildElement();
548 while ( !e.isNull() )
550 if ( e.tagName() ==
"symbol" )
553 if ( symbol != NULL )
554 symbols.insert( e.attribute(
"name" ), symbol );
560 e = e.nextSiblingElement();
567 QStringList subsymbols;
569 for ( QMap<QString, QgsSymbolV2*>::iterator it = symbols.begin(); it != symbols.end(); ++it )
571 if ( it.key()[0] !=
'@' )
575 subsymbols.append( it.key() );
577 QStringList parts = it.key().split(
"@" );
578 if ( parts.count() < 3 )
580 QgsDebugMsg(
"found subsymbol with invalid name: " + it.key() );
584 QString symname = parts[1];
585 int symlayer = parts[2].toInt();
587 if ( !symbols.contains( symname ) )
589 QgsDebugMsg(
"subsymbol references invalid symbol: " + symname );
597 QgsDebugMsg(
"subsymbol references invalid symbol layer: " + QString::number( symlayer ) );
606 QgsDebugMsg(
"symbol layer refused subsymbol: " + it.key() );
613 for (
int i = 0; i < subsymbols.count(); i++ )
614 symbols.take( subsymbols[i] );
621 QDomElement symbolsElem = doc.createElement( tagName );
623 QMap<QString, QgsSymbolV2*> subSymbols;
626 for ( QMap<QString, QgsSymbolV2*>::iterator its = symbols.begin(); its != symbols.end(); ++its )
628 QDomElement symEl =
saveSymbol( its.key(), its.value(), doc, &subSymbols );
629 symbolsElem.appendChild( symEl );
633 for ( QMap<QString, QgsSymbolV2*>::iterator itsub = subSymbols.begin(); itsub != subSymbols.end(); ++itsub )
635 QDomElement subsymEl =
saveSymbol( itsub.key(), itsub.value(), doc );
636 symbolsElem.appendChild( subsymEl );
644 foreach( QString name, symbols.keys() )
645 delete symbols.value( name );
652 QString rampType = element.attribute(
"type" );
657 if ( rampType ==
"gradient" )
659 else if ( rampType ==
"random" )
661 else if ( rampType ==
"colorbrewer" )
665 QgsDebugMsg(
"unknown colorramp type " + rampType );
673 QDomElement rampEl = doc.createElement(
"colorramp" );
674 rampEl.setAttribute(
"type", ramp->
type() );
675 rampEl.setAttribute(
"name", name );
727 if ( p && p->device() )
746 QImage::Format format = image->format();
747 if ( format != QImage::Format_ARGB32_Premultiplied && format != QImage::Format_ARGB32 )
754 for (
int heightIndex = 0; heightIndex < image->height(); ++heightIndex )
756 QRgb* scanLine = ( QRgb* )image->scanLine( heightIndex );
757 for (
int widthIndex = 0; widthIndex < image->width(); ++widthIndex )
759 myRgb = scanLine[widthIndex];
760 if ( format == QImage::Format_ARGB32_Premultiplied )
761 scanLine[widthIndex] = qRgba( alpha * qRed( myRgb ), alpha * qGreen( myRgb ), alpha * qBlue( myRgb ), alpha * qAlpha( myRgb ) );
763 scanLine[widthIndex] = qRgba( qRed( myRgb ), qGreen( myRgb ), qBlue( myRgb ), alpha * qAlpha( myRgb ) );
773 return lhs.toInt() < rhs.toInt();
775 return lhs.toUInt() < rhs.toUInt();
776 case QVariant::LongLong:
777 return lhs.toLongLong() < rhs.toLongLong();
778 case QVariant::ULongLong:
779 return lhs.toULongLong() < rhs.toULongLong();
780 case QVariant::Double:
781 return lhs.toDouble() < rhs.toDouble();
783 return lhs.toChar() < rhs.toChar();
785 return lhs.toDate() < rhs.toDate();
787 return lhs.toTime() < rhs.toTime();
788 case QVariant::DateTime:
789 return lhs.toDateTime() < rhs.toDateTime();
791 return QString::localeAwareCompare( lhs.toString(), rhs.toString() ) < 0;
802 if (order == Qt::AscendingOrder)