void PictureShape::saveOdf(KoShapeSavingContext &context) const { // make sure we have a valid image data pointer before saving KoImageData *imageData = qobject_cast<KoImageData*>(userData()); if (imageData == 0) { return; } KoXmlWriter &writer = context.xmlWriter(); writer.startElement("draw:frame"); saveOdfAttributes(context, OdfAllAttributes); writer.startElement("draw:image"); // In the spec, only the xlink:href attribute is marked as mandatory, cool :) QString name = context.imageHref(imageData); writer.addAttribute("xlink:type", "simple"); writer.addAttribute("xlink:show", "embed"); writer.addAttribute("xlink:actuate", "onLoad"); writer.addAttribute("xlink:href", name); saveText(context); writer.endElement(); // draw:image QSizeF scaleFactor(imageData->imageSize().width() / size().width(), imageData->imageSize().height() / size().height()); saveOdfClipContour(context, scaleFactor); writer.endElement(); // draw:frame context.addDataCenter(m_imageCollection); }
void PictureShape::saveOdf( KoShapeSavingContext & context ) const { // make sure we have a valid image data pointer before saving KoImageData * data = m_imageData; if( data != userData() ) data = dynamic_cast<KoImageData*> (userData()); if(data == 0) return; KoXmlWriter &writer = context.xmlWriter(); writer.startElement( "draw:frame" ); saveOdfAttributes( context, OdfAllAttributes ); writer.startElement("draw:image"); // In the spec, only the xlink:href attribute is marked as mandatory, cool :) QString name = context.imageHref(data); writer.addAttribute("xlink:type", "simple" ); writer.addAttribute("xlink:show", "embed" ); writer.addAttribute("xlink:actuate", "onLoad"); writer.addAttribute("xlink:href", name); writer.endElement(); // draw:image saveOdfCommonChildElements( context ); writer.endElement(); // draw:frame context.addDataCenter( m_imageCollection ); }
void VideoShape::saveOdf(KoShapeSavingContext &context) const { // make sure we have a valid image data pointer before saving VideoData *videoData = qobject_cast<VideoData*>(userData()); if (videoData == 0) return; KoXmlWriter &writer = context.xmlWriter(); writer.startElement("draw:frame"); saveOdfAttributes(context, OdfAllAttributes); writer.startElement("draw:plugin"); // In the spec, only the xlink:href attribute is marked as mandatory, cool :) QString name = videoData->tagForSaving(m_videoCollection->saveCounter); writer.addAttribute("xlink:type", "simple"); writer.addAttribute("xlink:show", "embed"); writer.addAttribute("xlink:actuate", "onLoad"); writer.addAttribute("xlink:href", name); writer.addAttribute("draw:mime-type", "application/vnd.sun.star.media"); writer.endElement(); // draw:plugin saveOdfCommonChildElements(context); writer.endElement(); // draw:frame context.addDataCenter(m_videoCollection); }
void KoConnectionShape::saveOdf(KoShapeSavingContext & context) const { Q_D(const KoConnectionShape); context.xmlWriter().startElement("draw:connector"); saveOdfAttributes(context, OdfMandatories | OdfAdditionalAttributes); switch (d->connectionType) { case Lines: context.xmlWriter().addAttribute("draw:type", "lines"); break; case Straight: context.xmlWriter().addAttribute("draw:type", "line"); break; case Curve: context.xmlWriter().addAttribute("draw:type", "curve"); break; default: context.xmlWriter().addAttribute("draw:type", "standard"); break; } if (d->shape1) { context.xmlWriter().addAttribute("draw:start-shape", context.xmlid(d->shape1, "shape", KoElementReference::Counter).toString()); context.xmlWriter().addAttribute("draw:start-glue-point", d->connectionPointId1); } else { QPointF p(shapeToDocument(d->handles[StartHandle]) * context.shapeOffset(this)); context.xmlWriter().addAttributePt("svg:x1", p.x()); context.xmlWriter().addAttributePt("svg:y1", p.y()); } if (d->shape2) { context.xmlWriter().addAttribute("draw:end-shape", context.xmlid(d->shape2, "shape", KoElementReference::Counter).toString()); context.xmlWriter().addAttribute("draw:end-glue-point", d->connectionPointId2); } else { QPointF p(shapeToDocument(d->handles[EndHandle]) * context.shapeOffset(this)); context.xmlWriter().addAttributePt("svg:x2", p.x()); context.xmlWriter().addAttributePt("svg:y2", p.y()); } // write the path data context.xmlWriter().addAttribute("svg:d", toString()); saveOdfAttributes(context, OdfViewbox); saveOdfCommonChildElements(context); saveText(context); context.xmlWriter().endElement(); }
void EnhancedPathShape::saveOdf(KShapeSavingContext &context) const { if (isParametricShape()) { context.xmlWriter().startElement("draw:custom-shape"); saveOdfAttributes(context, OdfAllAttributes&~OdfSize); // save the right size so that when loading we fit the viewbox // to the right size without getting any wrong scaling // -> calculate the right size from the current size/viewbound ratio const QSizeF currentSize = outline().boundingRect().size(); context.xmlWriter().addAttributePt("svg:width", m_viewBox.width()*currentSize.width()/m_viewBound.width()); context.xmlWriter().addAttributePt("svg:height", m_viewBox.height()*currentSize.height()/m_viewBound.height()); if (parent()) parent()->saveOdfChildElements(context); context.xmlWriter().startElement("draw:enhanced-geometry"); context.xmlWriter().addAttribute("svg:viewBox", QString("%1 %2 %3 %4").arg(m_viewBox.x()).arg(m_viewBox.y()).arg(m_viewBox.width()).arg(m_viewBox.height())); if (m_mirrorHorizontally) { context.xmlWriter().addAttribute("draw:mirror-horizontal", "true"); } if (m_mirrorVertically) { context.xmlWriter().addAttribute("draw:mirror-vertical", "true"); } QString modifiers; foreach (qreal modifier, m_modifiers) modifiers += QString::number(modifier) + ' '; context.xmlWriter().addAttribute("draw:modifiers", modifiers.trimmed()); QString path; foreach (EnhancedPathCommand * c, m_commands) path += c->toString() + ' '; context.xmlWriter().addAttribute("draw:enhanced-path", path.trimmed()); FormulaStore::const_iterator i = m_formulae.constBegin(); for (; i != m_formulae.constEnd(); ++i) { context.xmlWriter().startElement("draw:equation"); context.xmlWriter().addAttribute("draw:name", i.key()); context.xmlWriter().addAttribute("draw:formula", i.value()->toString()); context.xmlWriter().endElement(); // draw:equation } foreach (EnhancedPathHandle * handle, m_enhancedHandles) handle->saveOdf(context); context.xmlWriter().endElement(); // draw:enhanced-geometry saveOdfCommonChildElements(context); context.xmlWriter().endElement(); // draw:custom-shape } else { KPathShape::saveOdf(context); } }
void KoPathShape::saveOdf(KoShapeSavingContext & context) const { context.xmlWriter().startElement("draw:path"); saveOdfAttributes(context, OdfAllAttributes | OdfViewbox); context.xmlWriter().addAttribute("svg:d", toString(QMatrix())); context.xmlWriter().addAttribute("koffice:nodeTypes", nodeTypes()); saveOdfCommonChildElements(context); context.xmlWriter().endElement(); }
void KPrPlaceholderShape::saveOdf( KoShapeSavingContext & context ) const { KoXmlWriter & writer = context.xmlWriter(); writer.startElement( "draw:frame" ); saveOdfAttributes( context, OdfAllAttributes ); if ( m_strategy ) { m_strategy->saveOdf( context ); } saveOdfCommonChildElements( context ); writer.endElement(); // draw:frame }
void SceneObject::saveObjectOdf(KoShapeSavingContext &context) const { KoXmlWriter &writer = context.xmlWriter(); writer.startElement("dr3d:scene"); if (m_topLevel) { saveOdfAttributes(context, (OdfAdditionalAttributes | OdfMandatories | OdfGeometry)); } else { saveOdfAttributes(context, (OdfAdditionalAttributes | OdfMandatories)); } if (m_topLevel && m_threeDParams) m_threeDParams->saveOdfAttributes(writer); // 2.1 Light sources if (m_topLevel && m_threeDParams) m_threeDParams->saveOdfChildren(writer); // 2.2 Objects in the scene foreach (const Object3D *object, m_objects) { object->saveObjectOdf(context); }
void KoFormulaShape::saveOdf( KoShapeSavingContext& context ) const { // FIXME: Add saving of embedded document if m_isInline is false; kDebug() <<"Saving ODF in Formula"; KoXmlWriter& writer = context.xmlWriter(); writer.startElement("draw:frame"); saveOdfAttributes(context, OdfAllAttributes); writer.startElement( "draw:object" ); // TODO add some namespace magic to avoid adding "math:" namespace everywhere formulaData()->formulaElement()->writeMathML( &context.xmlWriter() ); writer.endElement(); // draw:object writer.endElement(); // draw:frame }
void KPathShape::saveOdf(KShapeSavingContext & context) const { Q_D(const KPathShape); context.xmlWriter().startElement("draw:path"); saveOdfAttributes(context, OdfAllAttributes | OdfViewbox); context.xmlWriter().addAttribute("svg:d", toString()); context.xmlWriter().addAttribute("koffice:nodeTypes", d->nodeTypes()); saveOdfCommonChildElements(context); if (parent()) parent()->saveOdfChildElements(context); context.xmlWriter().endElement(); }
void Rotate::saveObjectOdf(KoShapeSavingContext &context) const { kDebug(31000) << "Saving Rotate:" << m_path; KoXmlWriter &writer = context.xmlWriter(); writer.startElement("dr3d:rotate"); saveOdfAttributes(context, OdfObjectAttributes); Object3D::saveObjectOdf(context); writer.addAttribute("svg:d", m_path); writer.addAttribute("svg:viewBox", m_viewBox); writer.endElement(); // dr3d:rotate }
void RectangleShape::saveOdf(KoShapeSavingContext & context) const { if (isParametricShape()) { context.xmlWriter().startElement("draw:rect"); saveOdfAttributes(context, OdfAllAttributes); if (m_cornerRadiusX > 0 && m_cornerRadiusY > 0) { context.xmlWriter().addAttributePt("svg:rx", m_cornerRadiusX * (0.5*size().width()) / 100.0); context.xmlWriter().addAttributePt("svg:ry", m_cornerRadiusY * (0.5*size().height()) / 100.0); } saveOdfCommonChildElements(context); saveText(context); context.xmlWriter().endElement(); } else { KoPathShape::saveOdf(context); } }
void Cube::saveObjectOdf(KoShapeSavingContext &context) const { kDebug(31000) << "Saving Cube:" << m_minEdge << m_maxEdge; KoXmlWriter &writer = context.xmlWriter(); writer.startElement("dr3d:cube"); saveOdfAttributes(context, OdfObjectAttributes); Object3D::saveObjectOdf(context); writer.addAttribute("dr3d:min-edge", QString("(%1 %2 %3)").arg(m_minEdge.x()) .arg(m_minEdge.y()).arg(m_minEdge.z())); writer.addAttribute("dr3d:max-edge", QString("(%1 %2 %3)").arg(m_maxEdge.x()) .arg(m_maxEdge.y()).arg(m_maxEdge.z())); writer.endElement(); // dr3d:cube }
void Sphere::saveObjectOdf(KoShapeSavingContext &context) const { kDebug(31000) << "Saving Sphere:" << m_center << m_size; KoXmlWriter &writer = context.xmlWriter(); writer.startElement("dr3d:sphere"); saveOdfAttributes(context, OdfObjectAttributes); Object3D::saveObjectOdf(context); writer.addAttribute("dr3d:center", QString("(%1 %2 %3)").arg(m_center.x()) .arg(m_center.y()).arg(m_center.z())); writer.addAttribute("dr3d:size", QString("(%1 %2 %3)").arg(m_size.x()) .arg(m_size.y()).arg(m_size.z())); writer.endElement(); // dr3d:sphere }
void KoEnhancedPathShape::saveOdf( KoShapeSavingContext & context ) const { if( isParametricShape() ) { context.xmlWriter().startElement("draw:custom-shape"); saveOdfAttributes( context, OdfAllAttributes ); context.xmlWriter().startElement("draw:enhanced-geometry"); context.xmlWriter().addAttribute("svg:viewBox", QString("%1 %2 %3 %4").arg( m_viewBox.x() ).arg( m_viewBox.y() ).arg( m_viewBox.width() ).arg( m_viewBox.height() ) ); QString modifiers; foreach( qreal modifier, m_modifiers ) modifiers += QString::number( modifier ) + ' '; context.xmlWriter().addAttribute("draw:modifiers", modifiers.trimmed() ); QString path; foreach( KoEnhancedPathCommand * c, m_commands ) path += c->toString() + ' '; context.xmlWriter().addAttribute("draw:enhanced-path", path.trimmed() ); FormulaStore::const_iterator i = m_formulae.constBegin(); for( ; i != m_formulae.constEnd(); ++i ) { context.xmlWriter().startElement("draw:equation"); context.xmlWriter().addAttribute("draw:name", i.key() ); context.xmlWriter().addAttribute("draw:formula", i.value()->toString() ); context.xmlWriter().endElement(); // draw:equation } foreach( KoEnhancedPathHandle * handle, m_enhancedHandles ) handle->saveOdf( context ); context.xmlWriter().endElement(); // draw:enhanced-geometry saveOdfCommonChildElements( context ); context.xmlWriter().endElement(); // draw:custom-shape } else KoPathShape::saveOdf( context ); }
void ArtisticTextShape::saveOdf(KShapeSavingContext &context) const { context.xmlWriter().startElement("draw:custom-shape"); saveOdfAttributes( context, OdfAllAttributes & ~OdfGeometry ); // now write the special shape data context.xmlWriter().addAttribute( "draw:engine", "svg:text" ); // create the data attribute QString drawData = "text:" + m_text +';'; drawData += "font-family:" + m_font.family() + ';'; drawData += QString("font-size:%1pt;").arg(m_font.pointSizeF()); if ( m_font.bold() ) drawData += "font-weight:bold;"; if ( m_font.italic() ) drawData += "font-style:italic;"; qreal anchorOffset = 0.0; if ( m_textAnchor == ArtisticTextShape::AnchorMiddle ) { anchorOffset += 0.5 * size().width(); drawData += "text-anchor:middle;"; } else if ( m_textAnchor == ArtisticTextShape::AnchorEnd ) { anchorOffset += size().width(); drawData += "text-anchor:end;"; } // check if we are set on a path if ( layout() == ArtisticTextShape::OnPathShape ) { /// TODO: we have to make sure that the path shape is saved before drawData += "textPath:" + context.drawId( m_path ) +';'; drawData += QString( "startOffset:%1%;").arg( m_startOffset * 100.0 ); } else if ( layout() == ArtisticTextShape::OnPath ) { KPathShape * baseline = KPathShape::createShapeFromPainterPath( m_baseline ); QTransform offsetMatrix; offsetMatrix.translate( 0.0, m_baselineOffset ); drawData += "textPathData:" + baseline->toString( baseline->transformation() ) + ';'; drawData += QString( "startOffset:%1%;").arg( m_startOffset * 100.0 ); delete baseline; } context.xmlWriter().addAttribute( "draw:data", drawData ); // write a enhanced geometry element for compatibility with other applications context.xmlWriter().startElement("draw:enhanced-geometry"); // write the path data KPathShape * path = KPathShape::createShapeFromPainterPath( outline() ); context.xmlWriter().addAttribute("draw:enhanced-path", path->toString( transformation() ) ); delete path; context.xmlWriter().endElement(); // draw:enhanced-geometry saveOdfCommonChildElements( context ); context.xmlWriter().endElement(); // draw:custom-shape }
void PictureShape::paint(QPainter &painter, const KViewConverter &converter) { QRectF pixelsF = converter.documentToView(QRectF(QPointF(0,0), size())); KImageData *imageData = qobject_cast<KImageData*>(userData()); if (imageData == 0) { painter.fillRect(pixelsF, QColor(Qt::gray)); return; } const QRect pixels = pixelsF.toRect(); QSize pixmapSize = pixels.size(); QString key(generate_key(imageData->key(), pixmapSize)); QPixmap pixmap; #if QT_VERSION >= 0x040600 if (!QPixmapCache::find(key, &pixmap)) { // first check cache. #else if (!QPixmapCache::find(key, pixmap)) { // first check cache. #endif // no? Does the imageData have it then? if (!(imageData->hasCachedPixmap() && imageData->pixmap().size() == pixmapSize)) { // ok, not what we want. // before asking to render it, make sure the image doesn't get too big QSize imageSize = imageData->image().size(); if (imageSize.width() < pixmapSize.width() || imageSize.height() < pixmapSize.height()) { // kDebug() << "clipping size to orig image size" << imageSize; pixmapSize.setWidth(imageSize.width()); pixmapSize.setHeight(imageSize.height()); } if (m_printQualityImage.isNull()) { const int MaxSize = 1000; // TODO set the number as a KImageCollection size // make sure our pixmap doesn't get too slow. // In future we may want to make this action cause a multi-threaded rescale of the pixmap. if (pixmapSize.width() > MaxSize) { // resize to max size. pixmapSize.setHeight(qRound(pixelsF.height() / pixelsF.width() * MaxSize)); pixmapSize.setWidth(MaxSize); } if (pixmapSize.height() > MaxSize) { pixmapSize.setWidth(qRound(pixelsF.width() / pixelsF.height() * MaxSize)); pixmapSize.setHeight(MaxSize); } } key = generate_key(imageData->key(), pixmapSize); } } if (!m_printQualityImage.isNull() && pixmapSize == m_printQualityImage.size()) { // painting the image as prepared in waitUntilReady() painter.drawImage(pixels, m_printQualityImage, QRect(0, 0, pixmapSize.width(), pixmapSize.height())); m_printQualityImage = QImage(); // free memory return; } #if QT_VERSION >= 0x040600 if (!QPixmapCache::find(key, &pixmap)) { #else if (!QPixmapCache::find(key, pixmap)) { #endif m_renderQueue->addSize(pixmapSize); QTimer::singleShot(0, m_renderQueue, SLOT(renderImage())); if (!imageData->hasCachedPixmap() || imageData->pixmap().size().width() > pixmapSize.width()) { // don't scale down QTimer::singleShot(0, m_renderQueue, SLOT(updateShape())); return; } pixmap = imageData->pixmap(); } painter.drawPixmap(pixels, pixmap, QRect(0, 0, pixmap.width(), pixmap.height())); } void PictureShape::waitUntilReady(const KViewConverter &converter, bool asynchronous) const { KImageData *imageData = qobject_cast<KImageData*>(userData()); if (imageData == 0) { return; } if (asynchronous) { // get pixmap and schedule it if not QSize pixels = converter.documentToView(QRectF(QPointF(0,0), size())).size().toSize(); QImage image = imageData->image(); if (image.isNull()) { return; } if (image.size().width() < pixels.width()) { // don't scale up. pixels = image.size(); } m_printQualityImage = image.scaled(pixels, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else { QSize pixels = converter.documentToView(QRectF(QPointF(0,0), size())).size().toSize(); QString key(generate_key(imageData->key(), pixels)); if (QPixmapCache::find(key) == 0) { QPixmap pixmap = imageData->pixmap(pixels); QPixmapCache::insert(key, pixmap); } } } void PictureShape::saveOdf(KShapeSavingContext &context) const { // make sure we have a valid image data pointer before saving KImageData *imageData = qobject_cast<KImageData*>(userData()); if (imageData == 0) { return; } KXmlWriter &writer = context.xmlWriter(); writer.startElement("draw:frame"); saveOdfAttributes(context, OdfAllAttributes); writer.startElement("draw:image"); // In the spec, only the xlink:href attribute is marked as mandatory, cool :) QString name = context.imageHref(imageData); writer.addAttribute("xlink:type", "simple"); writer.addAttribute("xlink:show", "embed"); writer.addAttribute("xlink:actuate", "onLoad"); writer.addAttribute("xlink:href", name); if (parent()) { parent()->saveOdfChildElements(context); } writer.endElement(); // draw:image saveOdfCommonChildElements(context); writer.endElement(); // draw:frame context.addDataCenter(m_imageCollection); }