1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
/* This file is part of the KDE project
Copyright (C) 2011 Thorsten Zachmann <zachmann@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KoMarker.h"
#include <KoXmlReader.h>
#include <KoXmlWriter.h>
#include <KoXmlNS.h>
#include <KoGenStyle.h>
#include <KoGenStyles.h>
#include "KoPathShape.h"
#include "KoPathShapeLoader.h"
#include "KoShapeLoadingContext.h"
#include "KoShapeSavingContext.h"
#include <QString>
#include <QUrl>
#include <QPainterPath>
class KoMarker::Private
{
public:
Private()
{}
QString name;
QString d;
QPainterPath path;
QRectF viewBox;
};
KoMarker::KoMarker()
: d(new Private())
{
}
KoMarker::~KoMarker()
{
delete d;
}
bool KoMarker::loadOdf(const KoXmlElement &element, KoShapeLoadingContext &context)
{
Q_UNUSED(context);
// A shape uses draw:marker-end="Arrow" draw:marker-end-width="0.686cm" draw:marker-end-center="true" which marker and how the marker is used
//<draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="m10 0-10 30h20z"/>
//<draw:marker draw:name="Arrowheads_20_1" draw:display-name="Arrowheads 1" svg:viewBox="0 0 10 10" svg:d="m0 0h10v10h-10z"/>
d->d =element.attributeNS(KoXmlNS::svg, "d");
if (d->d.isEmpty()) {
return false;
}
KoPathShape pathShape;
KoPathShapeLoader loader(&pathShape);
loader.parseSvg(d->d, true);
d->path = pathShape.outline();
d->viewBox = KoPathShape::loadOdfViewbox(element);
QString displayName(element.attributeNS(KoXmlNS::draw, "display-name"));
if (displayName.isEmpty()) {
displayName = element.attributeNS(KoXmlNS::draw, "name");
}
d->name = displayName;
return true;
}
QString KoMarker::saveOdf(KoShapeSavingContext &context) const
{
KoGenStyle style(KoGenStyle::MarkerStyle);
style.addAttribute("draw:display-name", d->name);
style.addAttribute("svg:d", d->d);
QString viewBox = QString("0 0 %1 %2").arg(qRound(d->viewBox.width())).arg(qRound(d->viewBox.height()));
style.addAttribute("svg:viewBox", viewBox);
QString name = QString(QUrl::toPercentEncoding(d->name, "", " ")).replace('%', '_');
return context.mainStyles().insert(style, name, KoGenStyles::DontAddNumberToName);
}
QString KoMarker::name() const
{
return d->name;
}
QPainterPath KoMarker::path(qreal width) const
{
if (!d->viewBox.isValid() || width == 0) {
return QPainterPath();
}
qreal height = width * d->viewBox.height() / d->viewBox.width();
QTransform transform;
transform.scale(width / d->viewBox.width(), height / d->viewBox.height());
return transform.map(d->path);
}
bool KoMarker::operator==(const KoMarker &other) const
{
return (d->d == other.d->d && d->viewBox ==other.d->viewBox);
}
|