void SvgStyleWriter::saveSvgClipping(KoShape *shape, SvgSavingContext &context) { KoClipPath *clipPath = shape->clipPath(); if (!clipPath) return; const QSizeF shapeSize = shape->outlineRect().size(); KoPathShape *path = KoPathShape::createShapeFromPainterPath(clipPath->pathForSize(shapeSize)); if (!path) return; path->close(); const QString uid = context.createUID("clippath"); context.styleWriter().startElement("clipPath"); context.styleWriter().addAttribute("id", uid); context.styleWriter().addAttribute("clipPathUnits", "userSpaceOnUse"); context.styleWriter().startElement("path"); context.styleWriter().addAttribute("d", path->toString(path->absoluteTransformation(0)*context.userSpaceTransform())); context.styleWriter().endElement(); // path context.styleWriter().endElement(); // clipPath context.shapeWriter().addAttribute("clip-path", "url(#" + uid + ")"); if (clipPath->clipRule() != Qt::WindingFill) context.shapeWriter().addAttribute("clip-rule", "evenodd"); }
bool PictureShape::saveSvg(SvgSavingContext &context) { KoImageData *imageData = qobject_cast<KoImageData*>(userData()); if (!imageData) { qWarning() << "Picture has no image data. Omitting."; return false; } context.shapeWriter().startElement("image"); context.shapeWriter().addAttribute("id", context.getID(this)); QTransform m = transformation(); if (m.type() == QTransform::TxTranslate) { const QPointF pos = position(); context.shapeWriter().addAttributePt("x", pos.x()); context.shapeWriter().addAttributePt("y", pos.y()); } else { context.shapeWriter().addAttribute("transform", SvgUtil::transformToString(m)); } const QSizeF s = size(); context.shapeWriter().addAttributePt("width", s.width()); context.shapeWriter().addAttributePt("height", s.height()); context.shapeWriter().addAttribute("xlink:href", context.saveImage(imageData)); context.shapeWriter().endElement(); return true; }
void SvgStyleWriter::saveSvgColorStops(const QGradientStops &colorStops, SvgSavingContext &context) { Q_FOREACH (const QGradientStop &stop, colorStops) { context.styleWriter().startElement("stop"); context.styleWriter().addAttribute("stop-color", stop.second.name()); context.styleWriter().addAttribute("offset", stop.first); context.styleWriter().addAttribute("stop-opacity", stop.second.alphaF()); context.styleWriter().endElement(); }
void SvgStyleWriter::saveSvgStyle(KoShape *shape, SvgSavingContext &context) { saveSvgFill(shape, context); saveSvgStroke(shape, context); saveSvgEffects(shape, context); saveSvgClipping(shape, context); if (! shape->isVisible()) context.shapeWriter().addAttribute("display", "none"); if (shape->transparency() > 0.0) context.shapeWriter().addAttribute("opacity", 1.0 - shape->transparency()); }
void SvgStyleWriter::saveSvgEffects(KoShape *shape, SvgSavingContext &context) { KoFilterEffectStack * filterStack = shape->filterEffectStack(); if (!filterStack) return; QList<KoFilterEffect*> filterEffects = filterStack->filterEffects(); if (!filterEffects.count()) return; const QString uid = context.createUID("filter"); filterStack->save(context.styleWriter(), uid); context.shapeWriter().addAttribute("filter", "url(#" + uid + ")"); }
void SvgStyleWriter::saveSvgFill(KoShape *shape, SvgSavingContext &context) { if (! shape->background()) { context.shapeWriter().addAttribute("fill", "none"); } QBrush fill(Qt::NoBrush); QSharedPointer<KoColorBackground> cbg = qSharedPointerDynamicCast<KoColorBackground>(shape->background()); if (cbg) { context.shapeWriter().addAttribute("fill", cbg->color().name()); if (cbg->color().alphaF() < 1.0) context.shapeWriter().addAttribute("fill-opacity", cbg->color().alphaF()); } QSharedPointer<KoGradientBackground> gbg = qSharedPointerDynamicCast<KoGradientBackground>(shape->background()); if (gbg) { QString gradientId = saveSvgGradient(gbg->gradient(), gbg->transform(), context); context.shapeWriter().addAttribute("fill", "url(#" + gradientId + ")"); } QSharedPointer<KoPatternBackground> pbg = qSharedPointerDynamicCast<KoPatternBackground>(shape->background()); if (pbg) { const QString patternId = saveSvgPattern(pbg, shape, context); context.shapeWriter().addAttribute("fill", "url(#" + patternId + ")"); } KoPathShape * path = dynamic_cast<KoPathShape*>(shape); if (path && shape->background()) { // non-zero is default, so only write fillrule if evenodd is set if (path->fillRule() == Qt::OddEvenFill) context.shapeWriter().addAttribute("fill-rule", "evenodd"); } }
bool RectangleShape::saveSvg(SvgSavingContext &context) { context.shapeWriter().startElement("rect"); context.shapeWriter().addAttribute("id", context.getID(this)); context.shapeWriter().addAttribute("transform", SvgUtil::transformToString(transformation())); SvgStyleWriter::saveSvgStyle(this, context); const QSizeF size = this->size(); context.shapeWriter().addAttributePt("width", size.width()); context.shapeWriter().addAttributePt("height", size.height()); double rx = cornerRadiusX(); if (rx > 0.0) context.shapeWriter().addAttributePt("rx", 0.01 * rx * 0.5 * size.width()); double ry = cornerRadiusY(); if (ry > 0.0) context.shapeWriter().addAttributePt("ry", 0.01 * ry * 0.5 * size.height()); context.shapeWriter().endElement(); return true; }
void SvgStyleWriter::saveSvgStroke(KoShape *shape, SvgSavingContext &context) { const KoShapeStroke * line = dynamic_cast<const KoShapeStroke*>(shape->stroke()); if (! line) return; QString strokeStr("none"); if (line->lineBrush().gradient()) { QString gradientId = saveSvgGradient(line->lineBrush().gradient(), line->lineBrush().transform(), context); strokeStr = "url(#" + gradientId + ")"; } else { strokeStr = line->color().name(); } if (!strokeStr.isEmpty()) context.shapeWriter().addAttribute("stroke", strokeStr); if (line->color().alphaF() < 1.0) context.shapeWriter().addAttribute("stroke-opacity", line->color().alphaF()); context.shapeWriter().addAttribute("stroke-width", SvgUtil::toUserSpace(line->lineWidth())); if (line->capStyle() == Qt::FlatCap) context.shapeWriter().addAttribute("stroke-linecap", "butt"); else if (line->capStyle() == Qt::RoundCap) context.shapeWriter().addAttribute("stroke-linecap", "round"); else if (line->capStyle() == Qt::SquareCap) context.shapeWriter().addAttribute("stroke-linecap", "square"); if (line->joinStyle() == Qt::MiterJoin) { context.shapeWriter().addAttribute("stroke-linejoin", "miter"); context.shapeWriter().addAttribute("stroke-miterlimit", line->miterLimit()); } else if (line->joinStyle() == Qt::RoundJoin) context.shapeWriter().addAttribute("stroke-linejoin", "round"); else if (line->joinStyle() == Qt::BevelJoin) context.shapeWriter().addAttribute("stroke-linejoin", "bevel"); // dash if (line->lineStyle() > Qt::SolidLine) { qreal dashFactor = line->lineWidth(); if (line->dashOffset() != 0) context.shapeWriter().addAttribute("stroke-dashoffset", dashFactor * line->dashOffset()); QString dashStr; const QVector<qreal> dashes = line->lineDashes(); int dashCount = dashes.size(); for (int i = 0; i < dashCount; ++i) { if (i > 0) dashStr += ","; dashStr += QString("%1").arg(dashes[i] * dashFactor); } context.shapeWriter().addAttribute("stroke-dasharray", dashStr); } }