KoGenStyles::StyleMap::iterator KoGenStyles::Private::insertStyle(const KoGenStyle &style, const QString& baseName, InsertionFlags flags) { QString styleName(baseName); if (styleName.isEmpty()) { switch (style.type()) { case KoGenStyle::ParagraphAutoStyle: styleName = 'P'; break; case KoGenStyle::ListAutoStyle: styleName = 'L'; break; case KoGenStyle::TextAutoStyle: styleName = 'T'; break; default: styleName = 'A'; // for "auto". } flags &= ~DontAddNumberToName; // i.e. force numbering } styleName = makeUniqueName(styleName, style.m_familyName, flags); if (style.autoStyleInStylesDotXml()) autoStylesInStylesDotXml[style.m_familyName].insert(styleName); else styleNames[style.m_familyName].insert(styleName); KoGenStyles::StyleMap::iterator it = styleMap.insert(style, styleName); NamedStyle s; s.style = &it.key(); s.name = styleName; styleList.append(s); return it; }
void KoGenStyles::Private::saveOdfDocumentStyles(KoXmlWriter* xmlWriter) const { xmlWriter->startElement("office:styles"); for (uint i = 0; i < numStyleData; ++i) { const QMap<int, KoGenStyle>::const_iterator it(defaultStyles.constFind(styleData[i].m_type)); if (it != defaultStyles.constEnd()) { it.value().writeStyle(xmlWriter, *q, "style:default-style", "", styleData[i].m_propertiesElementName, true, styleData[i].m_drawElement); } } for (uint i = 0; i < numStyleData; ++i) { QList<KoGenStyles::NamedStyle> stylesList(styles(false, styleData[i].m_type)); QList<KoGenStyles::NamedStyle>::const_iterator it = stylesList.constBegin(); for (; it != stylesList.constEnd() ; ++it) { if (relations.contains(it->name)) { KoGenStyles::Private::RelationTarget relation = relations.value(it->name); KoGenStyle styleCopy = *(*it).style; styleCopy.addAttribute(relation.attribute, relation.target); styleCopy.writeStyle(xmlWriter, *q, styleData[i].m_elementName, (*it).name, styleData[i].m_propertiesElementName, true, styleData[i].m_drawElement); } else { (*it).style->writeStyle(xmlWriter, *q, styleData[i].m_elementName, (*it).name, styleData[i].m_propertiesElementName, true, styleData[i].m_drawElement); } } } if (!rawOdfDocumentStyles.isEmpty()) { xmlWriter->addCompleteElement(rawOdfDocumentStyles.constData()); } xmlWriter->endElement(); // office:styles }
QString KoTosContainer::saveStyle(KoGenStyle &style, KoShapeSavingContext &context) const { Qt::Alignment alignment = textAlignment(); QString verticalAlignment = "top"; Qt::Alignment vAlignment(alignment & Qt::AlignVertical_Mask); if (vAlignment == Qt::AlignBottom) { verticalAlignment = "bottom"; } else if (vAlignment == Qt::AlignVCenter || vAlignment == Qt::AlignCenter) { verticalAlignment = "middle"; } style.addProperty("draw:textarea-vertical-align", verticalAlignment); QString horizontalAlignment = "left"; Qt::Alignment hAlignment(alignment & Qt::AlignHorizontal_Mask); if (hAlignment == Qt::AlignCenter || hAlignment == Qt::AlignHCenter) { horizontalAlignment = "center"; } else if (hAlignment == Qt::AlignJustify) { horizontalAlignment = "justify"; } else if (hAlignment == Qt::AlignRight) { horizontalAlignment = "right"; } style.addProperty("draw:textarea-horizontal-align", horizontalAlignment); return KoShapeContainer::saveStyle(style, context); }
void KoPAMasterPage::saveOdf( KoShapeSavingContext & context ) const { KoPASavingContext &paContext = static_cast<KoPASavingContext&>( context ); KoGenStyle pageLayoutStyle = pageLayout().saveOdf(); pageLayoutStyle.setAutoStyleInStylesDotXml( true ); pageLayoutStyle.addAttribute( "style:page-usage", "all" ); QString pageLayoutName( paContext.mainStyles().insert( pageLayoutStyle, "pm" ) ); KoGenStyle pageMaster( KoGenStyle::MasterPageStyle ); pageMaster.addAttribute( "style:page-layout-name", pageLayoutName ); pageMaster.addAttribute( "style:display-name", name() ); pageMaster.addAttribute( "draw:style-name", saveOdfPageStyle( paContext ) ); KoXmlWriter &savedWriter = paContext.xmlWriter(); QBuffer buffer; buffer.open( QIODevice::WriteOnly ); KoXmlWriter xmlWriter( &buffer ); paContext.setXmlWriter( xmlWriter ); saveOdfPageContent( paContext ); paContext.setXmlWriter( savedWriter ); QString contentElement = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() ); pageMaster.addChildElement( paContext.masterPageElementName(), contentElement ); paContext.addMasterPage( this, paContext.mainStyles().insert( pageMaster, "Default" ) ); }
void KoPatternBackground::fillStyle(KoGenStyle &style, KoShapeSavingContext &context) { Q_D(KoPatternBackground); if (! d->imageData) return; switch (d->repeat) { case Original: style.addProperty("style:repeat", "no-repeat"); break; case Tiled: style.addProperty("style:repeat", "repeat"); break; case Stretched: style.addProperty("style:repeat", "stretch"); break; } if (d->repeat == Tiled) { QString refPointId = "top-left"; switch (d->refPoint) { case TopLeft: refPointId = "top-left"; break; case Top: refPointId = "top"; break; case TopRight: refPointId = "top-right"; break; case Left: refPointId = "left"; break; case Center: refPointId = "center"; break; case Right: refPointId = "right"; break; case BottomLeft: refPointId = "bottom-left"; break; case Bottom: refPointId = "bottom"; break; case BottomRight: refPointId = "bottom-right"; break; } style.addProperty("draw:fill-image-ref-point", refPointId); if (d->refPointOffsetPercent.x() > 0.0) style.addProperty("draw:fill-image-ref-point-x", QString("%1%").arg(d->refPointOffsetPercent.x())); if (d->refPointOffsetPercent.y() > 0.0) style.addProperty("draw:fill-image-ref-point-y", QString("%1%").arg(d->refPointOffsetPercent.y())); } if (d->repeat != Stretched) { QSizeF targetSize = d->targetSize(); QSizeF imageSize = d->imageData->imageSize(); if (targetSize.height() != imageSize.height()) style.addPropertyPt("draw:fill-image-height", targetSize.height()); if (targetSize.width() != imageSize.width()) style.addPropertyPt("draw:fill-image-width", targetSize.width()); } KoGenStyle patternStyle(KoGenStyle::FillImageStyle /*no family name*/); patternStyle.addAttribute("xlink:show", "embed"); patternStyle.addAttribute("xlink:actuate", "onLoad"); patternStyle.addAttribute("xlink:type", "simple"); patternStyle.addAttribute("xlink:href", context.imageHref(d->imageData)); QString patternStyleName = context.mainStyles().insert(patternStyle, "picture"); style.addProperty("draw:fill", "bitmap"); style.addProperty("draw:fill-image-name", patternStyleName); context.addDataCenter(d->imageCollection); }
//creates empty frameset element? void Document::headerEnd() { kDebug(30513) ; //close a list if we need to (you can have a list inside a header) if (m_textHandler->listIsOpen()) { kDebug(30513) << "closing a list in a header/footer"; m_textHandler->closeList(); } // NOTE: We are assuming in the parser code that odd header/footer is // present by default if the m_headers variable is not empty. It helps us // now to write the even header/footer content. // Close writer & add the header/footer content into the appropriate // master-page. // If it was an even header/footer, we wrote to this writer, but we won't // do anything with it. if (m_evenOpen) { m_headerWriter->endElement(); //style:header-left/footer-left m_evenOpen = false; } else { KoGenStyle* masterPageStyle = 0; QString name = 0; if (m_firstOpen) { name = m_masterPageName_list.first(); masterPageStyle = m_masterPageStyle_list.first(); m_firstOpen = false; } else { name = m_masterPageName_list.last(); masterPageStyle = m_masterPageStyle_list.last(); } Q_ASSERT(masterPageStyle); m_headerWriter->endElement(); //style:header/footer //add the even header/footer content here if (m_bufferEven) { m_headerWriter->addCompleteElement(m_bufferEven); delete m_bufferEven; m_bufferEven = 0; } QString contents = QString::fromUtf8(m_buffer->buffer(), m_buffer->buffer().size()); masterPageStyle->addChildElement(QString::number(m_headerCount), contents); kDebug(30513) << "updating master-page style:" << name; delete m_buffer; m_buffer = 0; } delete m_headerWriter; m_headerWriter = 0; //we're done with this header, so reset to false m_writingHeader = false; }
void WordsTableHandler::tableCellEnd() { kDebug(30513); if (!m_cellOpen) { kDebug(30513) << "BUG: !m_cellOpen"; return; } // Text lists aren't closed explicitly so we have to close them // when something happens like a new paragraph or, in this case, // the table cell ends. if (document()->textHandler()->listIsOpen()) { document()->textHandler()->closeList(); } KoXmlWriter* writer = currentWriter(); QList<const char*> openTags = writer->tagHierarchy(); for (int i = 0; i < openTags.size(); ++i) { kDebug(30513) << openTags[i]; } writer->endElement();//table:table-cell m_cellOpen = false; // If this cell covers other cells (i.e. is merged), then create as many // table:covered-table-cell tags as there are covered columns. for (int i = 1; i < m_colSpan; i++) { writer->startElement("table:covered-table-cell"); writer->endElement(); } m_colSpan = 1; //Leaving out the table:style-name attribute and creation of the //corresponding style for covered table cells in the tableCellStart f. if (!m_tap || m_cellStyleName.isEmpty()) { return; } //process shading information const wvWare::Word97::SHD& shd = m_tap->rgshd[ m_column ]; QString color = Conversion::shdToColorStr(shd, document()->textHandler()->paragraphBgColor(), document()->textHandler()->paragraphBaseFontColorBkp()); if (!color.isNull()) { KoGenStyle* cellStyle = m_mainStyles->styleForModification(m_cellStyleName, "table-cell"); Q_ASSERT(cellStyle); if (cellStyle) { cellStyle->addProperty("fo:background-color", color, KoGenStyle::TableCellType); } m_cellStyleName.clear(); //add the current background-color to stack // document()->pushBgColor(color); } }
void KoTableRowStyle::saveOdf(KoGenStyle &style) const { QList<int> keys = d->stylesPrivate.keys(); foreach(int key, keys) { if (key == QTextFormat::BackgroundBrush) { QBrush backBrush = background(); if (backBrush.style() != Qt::NoBrush) style.addProperty("fo:background-color", backBrush.color().name(), KoGenStyle::TableRowType); else style.addProperty("fo:background-color", "transparent", KoGenStyle::TableRowType); } else if (key == MinimumRowHeight) { style.addPropertyPt("style:min-row-height", minimumRowHeight(), KoGenStyle::TableRowType); } else if (key == RowHeight) { style.addPropertyPt("style:row-height", rowHeight(), KoGenStyle::TableRowType); } else if (key == UseOptimalHeight) { style.addProperty("style:use-optimal-row-height", useOptimalHeight(), KoGenStyle::TableRowType); } else if (key == BreakBefore) { style.addProperty("fo:break-before", KoText::textBreakToString(breakBefore()), KoGenStyle::TableRowType); } else if (key == BreakAfter) { style.addProperty("fo:break-after", KoText::textBreakToString(breakAfter()), KoGenStyle::TableRowType); } else if (key == KeepTogether) { if (keepTogether()) style.addProperty("fo:keep-together", "always", KoGenStyle::TableRowType); else style.addProperty("fo:keep-together", "auto", KoGenStyle::TableRowType); } } }
QString Extrude::saveStyle(KoGenStyle& style, KoShapeSavingContext& context) const { style.addProperty("dr3d:depth", QString("%1").arg(m_depth)); style.addProperty("dr3d:close-front", m_closeFront); style.addProperty("dr3d:close-back", m_closeBack); if (m_backScale != 1.0) { style.addProperty("dr3d:back-scale", QString("%1").arg(m_backScale)); } return KoShape::saveStyle(style, context); }
void KoShapeShadow::fillStyle(KoGenStyle &style, KoShapeSavingContext &context) { Q_UNUSED(context); style.addProperty("draw:shadow", d->visible ? "visible" : "hidden", KoGenStyle::GraphicType); style.addProperty("draw:shadow-color", d->color.name(), KoGenStyle::GraphicType); if (d->color.alphaF() != 1.0) style.addProperty("draw:shadow-opacity", QString("%1%").arg(d->color.alphaF() * 100.0), KoGenStyle::GraphicType); style.addProperty("draw:shadow-offset-x", QString("%1pt").arg(d->offset.x()), KoGenStyle::GraphicType); style.addProperty("draw:shadow-offset-y", QString("%1pt").arg(d->offset.y()), KoGenStyle::GraphicType); if (d->blur != 0) style.addProperty("calligra:shadow-blur-radius", QString("%1pt").arg(d->blur), KoGenStyle::GraphicType); }
KoGenStyle WordsGraphicsHandler::DrawClient::createGraphicStyle(const MSO::OfficeArtClientTextBox* ct, const MSO::OfficeArtClientData* cd, const DrawStyle& ds, Writer& out) { Q_UNUSED(ct); Q_UNUSED(cd); KoGenStyle style = KoGenStyle(KoGenStyle::GraphicAutoStyle, "graphic"); style.setAutoStyleInStylesDotXml(out.stylesxml); // Set specific attributes of graphic-properties. gh->definePositionAttributes(style, ds); gh->defineWrappingAttributes(style, ds); return style; }
void KoColumnStyle::prepareStyle(KoGenStyle& style) const { if(m_breakAfter != NoBreak) { style.addProperty("fo:break-after", breakStyleMap.value(m_breakAfter)); } if(m_breakBefore != NoBreak) { style.addProperty("fo:break-before", breakStyleMap.value(m_breakBefore)); } switch(m_widthType) { case MinimumWidth: style.addPropertyPt("style:min-column-width", m_width); break; case ExactWidth: style.addPropertyPt("style:column-width", m_width); break; case OptimalWidth: style.addProperty("style:use-optimal-column-width", "true"); break; } }
void KPrPageEffect::saveOdfSmilAttributes( KoGenStyle & style ) const { QString speed("slow"); if (m_duration < 2500) { speed = "fast"; } else if (m_duration < 7500) { speed = "medium"; } style.addProperty("presentation:transition-speed", speed); return m_strategy->saveOdfSmilAttributes(style); }
void KoGenStyle::copyPropertiesFromStyle(const KoGenStyle &sourceStyle, KoGenStyle &targetStyle, PropertyType type) { if (type == DefaultType) { type = sourceStyle.m_propertyType; } const StyleMap& map = sourceStyle.m_properties[type]; if (!map.isEmpty()) { QMap<QString, QString>::const_iterator it = map.constBegin(); const QMap<QString, QString>::const_iterator end = map.constEnd(); for (; it != end; ++it) { targetStyle.addProperty(it.key(), it.value(), type); } } }
void Conditions::saveOdfConditions(KoGenStyle ¤tCellStyle, ValueConverter *converter) const { //todo fix me with kspread old format!!! if (d->conditionList.isEmpty()) return; QLinkedList<Conditional>::const_iterator it; int i = 0; for (it = d->conditionList.begin(); it != d->conditionList.end(); ++it, ++i) { Conditional condition = *it; //<style:map style:condition="cell-content()=45" style:apply-style-name="Default" style:base-cell-address="Sheet1.E10"/> QMap<QString, QString> map; map.insert("style:condition", saveOdfConditionValue(condition, converter)); map.insert("style:apply-style-name", condition.styleName); if (!condition.baseCellAddress.isEmpty()) map.insert("style:base-cell-address", condition.baseCellAddress); currentCellStyle.addStyleMap(map); } }
void Document::slotSectionEnd(wvWare::SharedPtr<const wvWare::Word97::SEP> sep) { kDebug(30513); KoGenStyle* masterPageStyle = 0; KoGenStyle* pageLayoutStyle = 0; QString pageLayoutName; for (int i = 0; i < m_masterPageName_list.size(); i++) { pageLayoutStyle = m_pageLayoutStyle_list[i]; masterPageStyle = m_masterPageStyle_list[i]; Q_ASSERT(pageLayoutStyle); Q_ASSERT(masterPageStyle); //set the margins - depends on whether a header/footer is present if (m_hasHeader_list[i]) { kDebug(30513) << "setting margin for header..."; pageLayoutStyle->addPropertyPt("fo:margin-top", (double)sep->dyaHdrTop / 20.0); } else if (sep->brcTop.brcType == 0) { kDebug(30513) << "setting margin for no header and no top border..."; pageLayoutStyle->addPropertyPt("fo:margin-top", (double)sep->dyaTop / 20.0); } if (m_hasFooter_list[i]) { pageLayoutStyle->addPropertyPt("fo:margin-bottom", (double)sep->dyaHdrBottom / 20.0); } else if (sep->brcBottom.brcType == 0) { pageLayoutStyle->addPropertyPt("fo:margin-bottom", (double)sep->dyaBottom / 20.0); } pageLayoutName = m_mainStyles->insert(*pageLayoutStyle, "Mpm"); masterPageStyle->addAttribute("style:page-layout-name", pageLayoutName); m_mainStyles->insert(*masterPageStyle, m_masterPageName_list[i], KoGenStyles::DontAddNumberToName); //delete objects, we've added them to the collection delete masterPageStyle; delete pageLayoutStyle; } //clear lists m_pageLayoutStyle_list.clear(); m_masterPageStyle_list.clear(); m_masterPageName_list.clear(); m_hasHeader_list.clear(); m_hasFooter_list.clear(); //reset header data m_headerCount = 0; }
void WordsGraphicsHandler::definePositionAttributes(KoGenStyle& style, const DrawStyle& ds) { if (m_processingGroup) return; const KoGenStyle::PropertyType gt = KoGenStyle::GraphicType; if (m_objectType == Inline) { style.addProperty("style:vertical-rel", "baseline", gt); style.addProperty("style:vertical-pos", "top", gt); } else { style.addProperty("style:horizontal-pos", getHorizontalPos(ds.posH()), gt); style.addProperty("style:horizontal-rel", getHorizontalRel(ds.posRelH()), gt); style.addProperty("style:vertical-pos", getVerticalPos(ds.posV()), gt); style.addProperty("style:vertical-rel", getVerticalRel(ds.posRelV()), gt); } }
void KoSectionStyle::saveOdf(KoGenStyle &style) { // only custom style have a displayname. automatic styles don't have a name set. if (!d->name.isEmpty() && !style.isDefaultStyle()) { style.addAttribute("style:display-name", d->name); } QList<int> keys = d->stylesPrivate.keys(); foreach(int key, keys) { if (key == KoSectionStyle::TextProgressionDirection) { int directionValue = 0; bool ok = false; directionValue = d->stylesPrivate.value(key).toInt(&ok); if (ok) { QString direction; if (directionValue == KoText::LeftRightTopBottom) direction = "lr-tb"; else if (directionValue == KoText::RightLeftTopBottom) direction = "rl-tb"; else if (directionValue == KoText::TopBottomRightLeft) direction = "tb-lr"; else if (directionValue == KoText::InheritDirection) direction = "page"; if (!direction.isEmpty()) style.addProperty("style:writing-mode", direction, KoGenStyle::DefaultType); } } else if (key == QTextFormat::BackgroundBrush) { QBrush backBrush = background(); if (backBrush.style() != Qt::NoBrush) style.addProperty("fo:background-color", backBrush.color().name(), KoGenStyle::ParagraphType); else style.addProperty("fo:background-color", "transparent", KoGenStyle::DefaultType); } else if (key == QTextFormat::BlockLeftMargin) { style.addPropertyPt("fo:margin-left", leftMargin(), KoGenStyle::DefaultType); } else if (key == QTextFormat::BlockRightMargin) { style.addPropertyPt("fo:margin-right", rightMargin(), KoGenStyle::DefaultType); } } }
QString Rotate::saveStyle(KoGenStyle& style, KoShapeSavingContext& context) const { if (m_horizontalSegments != -1) { style.addProperty("dr3d:horizontal-segments", QString("%1").arg(m_horizontalSegments)); } if (m_verticalSegments != -1) { style.addProperty("dr3d:vertical-segments", QString("%1").arg(m_verticalSegments)); } if (m_endAngle != 360.0) { style.addProperty("dr3d:end-angle", QString("%1").arg(m_endAngle)); } style.addProperty("dr3d:close-front", m_closeFront); style.addProperty("dr3d:close-back", m_closeBack); if (m_backScale != 1.0) { style.addProperty("dr3d:back-scale", QString("%1").arg(m_backScale)); } return KoShape::saveStyle(style, context); }
void KoOdfGraphicStyles::saveOdfFillStyle(KoGenStyle &styleFill, KoGenStyles& mainStyles, const QBrush & brush) { switch (brush.style()) { case Qt::Dense1Pattern: styleFill.addProperty("draw:transparency", "94%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::Dense2Pattern: styleFill.addProperty("draw:transparency", "88%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::Dense3Pattern: styleFill.addProperty("draw:transparency", "63%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::Dense4Pattern: styleFill.addProperty("draw:transparency", "50%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::Dense5Pattern: styleFill.addProperty("draw:transparency", "37%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::Dense6Pattern: styleFill.addProperty("draw:transparency", "12%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::Dense7Pattern: styleFill.addProperty("draw:transparency", "6%"); styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); break; case Qt::LinearGradientPattern: case Qt::RadialGradientPattern: case Qt::ConicalGradientPattern: styleFill.addProperty("draw:fill", "gradient"); styleFill.addProperty("draw:fill-gradient-name", saveOdfGradientStyle(mainStyles, brush)); break; case Qt::HorPattern: case Qt::VerPattern: case Qt::CrossPattern: case Qt::BDiagPattern: case Qt::FDiagPattern: case Qt::DiagCrossPattern: styleFill.addProperty("draw:fill", "hatch"); styleFill.addProperty("draw:fill-hatch-name", saveOdfHatchStyle(mainStyles, brush)); break; case Qt::SolidPattern: styleFill.addProperty("draw:fill", "solid"); styleFill.addProperty("draw:fill-color", brush.color().name()); if (! brush.isOpaque()) styleFill.addProperty("draw:opacity", QString("%1%").arg(brush.color().alphaF() * 100.0)); break; case Qt::NoBrush: default: styleFill.addProperty("draw:fill", "none"); break; } }
void KoTblStyle::prepareStyle(KoGenStyle& style) const { if(m_backgroundColor.isValid()) { style.addProperty("fo:background-color", m_backgroundColor.name()); } if (m_breakAfter != KoTblStyle::NoBreak) { style.addProperty("fo:break-after", breakStyleMap.value(m_breakAfter)); } if (m_breakBefore != KoTblStyle::NoBreak) { style.addProperty("fo:break-before", breakStyleMap.value(m_breakBefore)); } style.addProperty("fo:keep-with-next", keepWithNextMap.value(m_keepWithNext)); style.addPropertyPt("fo:margin-top", m_topMargin); style.addPropertyPt("fo:margin-right", m_rightMargin); style.addPropertyPt("fo:margin-bottom", m_bottomMargin); style.addPropertyPt("fo:margin-left", m_leftMargin); // style:width may not be 0, use style:rel-width if width is 0 if (m_widthUnit == PercentageUnit || m_width <= 0) { style.addProperty("style:rel-width", QString::number(m_width) + QLatin1Char('%')); } else { style.addPropertyPt("style:width", m_width); } style.addProperty("style:may-break-between-rows", m_allowBreakBetweenRows ? "true" : "false"); style.addProperty("style:writing-mode", writingModeMap.value(m_writingMode)); style.addProperty("table:align", horizontalAlignMap.value(m_horizontalAlign)); style.addProperty("table:border-model", borderModelMap.value(m_borderModel)); if(!m_display) { style.addProperty("table:display", "false"); } if(!m_masterPageName.isEmpty()) { style.addAttribute("style:master-page-name", m_masterPageName); } }
void WordsGraphicsHandler::defineWrappingAttributes(KoGenStyle& style, const DrawStyle& ds) { if (m_processingGroup) return; if (m_objectType == Inline) return; const KoGenStyle::PropertyType gt = KoGenStyle::GraphicType; wvWare::Word97::FSPA* spa = m_pSpa; // style:number-wrapped-paragraphs // style:run-through // style:wrap // style:wrap-contour // style:wrap-contour-mode // style:wrap-dynamic-threshold if (spa != 0) { bool check_wrk = false; switch (spa->wr) { case 0: //wrap around the object case 2: //square wrapping check_wrk = true; break; case 1: //top and bottom wrapping style.addProperty("style:wrap", "none", gt); break; case 3: //in front or behind the text style.addProperty("style:wrap", "run-through", gt); //check if shape is behind the text if ((spa->fBelowText == 1) || (ds.fBehindDocument())) { style.addProperty("style:run-through", "background", gt); } else { style.addProperty("style:run-through", "foreground", gt); } break; case 4: //tight wrapping check_wrk = true; style.addProperty("style:wrap-contour", "true", gt); style.addProperty("style:wrap-contour-mode", "outside", gt); break; case 5: //through wrapping check_wrk = true; style.addProperty("style:wrap-contour", "true", gt); style.addProperty("style:wrap-contour-mode", "full", gt); break; } //check details of the text wrapping around this shape if (check_wrk) { switch (spa->wrk) { case 0: style.addProperty("style:wrap", "parallel", gt); break; case 1: style.addProperty("style:wrap", "left", gt); break; case 2: style.addProperty("style:wrap", "right", gt); break; case 3: style.addProperty("style:wrap", "biggest", gt); break; } } // ODF-1.2: specifies the number of paragraphs that can wrap around a // frame if wrap mode is in {left, right, parallel, dynamic} and anchor // type is in {char, paragraph} if ((spa->wr != 1) && (spa->wr != 3)) { style.addProperty("style:number-wrapped-paragraphs", "no-limit"); } } else { style.addProperty("style:wrap", "run-through", gt); if (ds.fBehindDocument()) { style.addProperty("style:run-through", "background", gt); } else { style.addProperty("style:run-through", "foreground", gt); } } }
QString KoGenStyles::insert(const KoGenStyle& style, const QString& baseName, InsertionFlags flags) { // if it is a default style it has to be saved differently if (style.isDefaultStyle()) { // we can have only one default style per type Q_ASSERT(!d->defaultStyles.contains(style.type())); // default style is only possible for style:style in office:style types Q_ASSERT(style.type() == KoGenStyle::TextStyle || style.type() == KoGenStyle::ParagraphStyle || style.type() == KoGenStyle::SectionStyle || style.type() == KoGenStyle::RubyStyle || style.type() == KoGenStyle::TableStyle || style.type() == KoGenStyle::TableColumnStyle || style.type() == KoGenStyle::TableRowStyle || style.type() == KoGenStyle::TableCellStyle || style.type() == KoGenStyle::GraphicStyle || style.type() == KoGenStyle::PresentationStyle || style.type() == KoGenStyle::DrawingPageStyle || style.type() == KoGenStyle::ChartStyle); d->defaultStyles.insert(style.type(), style); // default styles don't have a name return QString(); } if (flags & AllowDuplicates) { StyleMap::iterator it = d->insertStyle(style, baseName, flags); return it.value(); } StyleMap::iterator it = d->styleMap.find(style); if (it == d->styleMap.end()) { // Not found, try if this style is in fact equal to its parent (the find above // wouldn't have found it, due to m_parentName being set). if (!style.parentName().isEmpty()) { KoGenStyle testStyle(style); const KoGenStyle* parentStyle = this->style(style.parentName(), style.familyName()); // ## linear search if (!parentStyle) { kDebug(30003) << "baseName=" << baseName << "parent style" << style.parentName() << "not found in collection"; } else { // TODO remove if (testStyle.m_familyName != parentStyle->m_familyName) { kWarning(30003) << "baseName=" << baseName << "family=" << testStyle.m_familyName << "parent style" << style.parentName() << "has a different family:" << parentStyle->m_familyName; } testStyle.m_parentName = parentStyle->m_parentName; // Exclude the type from the comparison. It's ok for an auto style // to have a user style as parent; they can still be identical testStyle.m_type = parentStyle->m_type; // Also it's ok to not have the display name of the parent style // in the auto style QMap<QString, QString>::const_iterator it = parentStyle->m_attributes.find("style:display-name"); if (it != parentStyle->m_attributes.end()) testStyle.addAttribute("style:display-name", *it); if (*parentStyle == testStyle) return style.parentName(); } } it = d->insertStyle(style, baseName, flags); } return it.value(); }
QString KoOdfGraphicStyles::saveOdfGradientStyle(KoGenStyles &mainStyles, const QBrush &brush) { KoGenStyle gradientStyle; if (brush.style() == Qt::RadialGradientPattern) { const QRadialGradient *gradient = static_cast<const QRadialGradient*>(brush.gradient()); gradientStyle = KoGenStyle(KoGenStyle::RadialGradientStyle /*no family name*/); gradientStyle.addAttributePercent("svg:cx", gradient->center().x() * 100); gradientStyle.addAttributePercent("svg:cy", gradient->center().y() * 100); gradientStyle.addAttributePercent("svg:r", gradient->radius() * 100); gradientStyle.addAttributePercent("svg:fx", gradient->focalPoint().x() * 100); gradientStyle.addAttributePercent("svg:fy", gradient->focalPoint().y() * 100); } else if (brush.style() == Qt::LinearGradientPattern) { const QLinearGradient *gradient = static_cast<const QLinearGradient*>(brush.gradient()); gradientStyle = KoGenStyle(KoGenStyle::LinearGradientStyle /*no family name*/); gradientStyle.addAttributePercent("svg:x1", gradient->start().x() * 100); gradientStyle.addAttributePercent("svg:y1", gradient->start().y() * 100); gradientStyle.addAttributePercent("svg:x2", gradient->finalStop().x() * 100); gradientStyle.addAttributePercent("svg:y2", gradient->finalStop().y() * 100); } else if (brush.style() == Qt::ConicalGradientPattern) { const QConicalGradient * gradient = static_cast<const QConicalGradient*>(brush.gradient()); gradientStyle = KoGenStyle(KoGenStyle::ConicalGradientStyle /*no family name*/); gradientStyle.addAttributePercent("svg:cx", gradient->center().x() * 100); gradientStyle.addAttributePercent("svg:cy", gradient->center().y() * 100); gradientStyle.addAttribute("draw:angle", QString("%1").arg(gradient->angle())); } const QGradient * gradient = brush.gradient(); if (gradient->spread() == QGradient::RepeatSpread) gradientStyle.addAttribute("svg:spreadMethod", "repeat"); else if (gradient->spread() == QGradient::ReflectSpread) gradientStyle.addAttribute("svg:spreadMethod", "reflect"); else gradientStyle.addAttribute("svg:spreadMethod", "pad"); if (! brush.transform().isIdentity()) { gradientStyle.addAttribute("svg:gradientTransform", saveTransformation(brush.transform())); } QBuffer buffer; buffer.open(QIODevice::WriteOnly); KoXmlWriter elementWriter(&buffer); // TODO pass indentation level // save stops QGradientStops stops = gradient->stops(); Q_FOREACH (const QGradientStop & stop, stops) { elementWriter.startElement("svg:stop"); elementWriter.addAttribute("svg:offset", QString("%1").arg(stop.first)); elementWriter.addAttribute("svg:stop-color", stop.second.name()); if (stop.second.alphaF() < 1.0) elementWriter.addAttribute("svg:stop-opacity", QString("%1").arg(stop.second.alphaF())); elementWriter.endElement(); }
void KoOdfGraphicStyles::saveOdfStrokeStyle(KoGenStyle &styleStroke, KoGenStyles &mainStyles, const QPen &pen) { // TODO implement all possibilities switch (pen.style()) { case Qt::NoPen: styleStroke.addProperty("draw:stroke", "none", KoGenStyle::GraphicType); return; case Qt::SolidLine: styleStroke.addProperty("draw:stroke", "solid", KoGenStyle::GraphicType); break; default: { // must be a dashed line styleStroke.addProperty("draw:stroke", "dash", KoGenStyle::GraphicType); // save stroke dash (14.14.7) which is severly limited, but still KoGenStyle dashStyle(KoGenStyle::StrokeDashStyle); dashStyle.addAttribute("draw:style", "rect"); QVector<qreal> dashes = pen.dashPattern(); dashStyle.addAttribute("draw:dots1", static_cast<int>(1)); dashStyle.addAttributePt("draw:dots1-length", dashes[0]*pen.widthF()); dashStyle.addAttributePt("draw:distance", dashes[1]*pen.widthF()); if (dashes.size() > 2) { dashStyle.addAttribute("draw:dots2", static_cast<int>(1)); dashStyle.addAttributePt("draw:dots2-length", dashes[2]*pen.widthF()); } QString dashStyleName = mainStyles.insert(dashStyle, "dash"); styleStroke.addProperty("draw:stroke-dash", dashStyleName, KoGenStyle::GraphicType); break; } } if (pen.brush().gradient()) { styleStroke.addProperty("calligra:stroke-gradient", saveOdfGradientStyle(mainStyles, pen.brush()), KoGenStyle::GraphicType); } else { styleStroke.addProperty("svg:stroke-color", pen.color().name(), KoGenStyle::GraphicType); styleStroke.addProperty("svg:stroke-opacity", QString("%1").arg(pen.color().alphaF()), KoGenStyle::GraphicType); } styleStroke.addPropertyPt("svg:stroke-width", pen.widthF(), KoGenStyle::GraphicType); switch (pen.joinStyle()) { case Qt::MiterJoin: styleStroke.addProperty("draw:stroke-linejoin", "miter", KoGenStyle::GraphicType); break; case Qt::BevelJoin: styleStroke.addProperty("draw:stroke-linejoin", "bevel", KoGenStyle::GraphicType); break; case Qt::RoundJoin: styleStroke.addProperty("draw:stroke-linejoin", "round", KoGenStyle::GraphicType); break; default: styleStroke.addProperty("draw:stroke-linejoin", "miter", KoGenStyle::GraphicType); styleStroke.addProperty("calligra:stroke-miterlimit", QString("%1").arg(pen.miterLimit()), KoGenStyle::GraphicType); break; } switch (pen.capStyle()) { case Qt::RoundCap: styleStroke.addProperty("svg:stroke-linecap", "round", KoGenStyle::GraphicType); break; case Qt::SquareCap: styleStroke.addProperty("svg:stroke-linecap", "square", KoGenStyle::GraphicType); break; default: styleStroke.addProperty("svg:stroke-linecap", "butt", KoGenStyle::GraphicType); break; } }
void KoOdfGraphicStyles::saveOdfFillStyle(KoGenStyle &styleFill, KoGenStyles& mainStyles, const QBrush & brush) { KoGenStyle::Type type = styleFill.type(); KoGenStyle::PropertyType propertyType = (type == KoGenStyle::GraphicStyle || type == KoGenStyle::GraphicAutoStyle || type == KoGenStyle::DrawingPageStyle || type == KoGenStyle::DrawingPageAutoStyle ) ? KoGenStyle::DefaultType : KoGenStyle::GraphicType; switch (brush.style()) { case Qt::Dense1Pattern: styleFill.addProperty("draw:opacity", "6%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::Dense2Pattern: styleFill.addProperty("draw:opacity", "12%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::Dense3Pattern: styleFill.addProperty("draw:opacity", "37%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::Dense4Pattern: styleFill.addProperty("draw:opacity", "50%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::Dense5Pattern: styleFill.addProperty("draw:opacity", "63%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::Dense6Pattern: styleFill.addProperty("draw:opacity", "88%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::Dense7Pattern: styleFill.addProperty("draw:opacity", "94%", propertyType); styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); break; case Qt::LinearGradientPattern: case Qt::RadialGradientPattern: case Qt::ConicalGradientPattern: styleFill.addProperty("draw:fill", "gradient", propertyType); styleFill.addProperty("draw:fill-gradient-name", saveOdfGradientStyle(mainStyles, brush), propertyType); break; case Qt::HorPattern: case Qt::VerPattern: case Qt::CrossPattern: case Qt::BDiagPattern: case Qt::FDiagPattern: case Qt::DiagCrossPattern: styleFill.addProperty("draw:fill", "hatch", propertyType); styleFill.addProperty("draw:fill-hatch-name", saveOdfHatchStyle(mainStyles, brush), propertyType); break; case Qt::SolidPattern: styleFill.addProperty("draw:fill", "solid", propertyType); styleFill.addProperty("draw:fill-color", brush.color().name(), propertyType); if (! brush.isOpaque()) styleFill.addProperty("draw:opacity", QString("%1%").arg(brush.color().alphaF() * 100.0), propertyType); break; case Qt::NoBrush: default: styleFill.addProperty("draw:fill", "none", propertyType); break; } }
void KPrFadeOverColorStrategy::saveOdfSmilAttributes(KoGenStyle & style) const { KPrPageEffectStrategy::saveOdfSmilAttributes(style); style.addProperty("smil:fadeColor", m_fadeColor.name()); }
void Document::slotSectionEnd(wvWare::SharedPtr<const wvWare::Word97::SEP> sep) { kDebug(30513); KoGenStyle* masterPageStyle = 0; KoGenStyle* pageLayoutStyle = 0; QString pageLayoutName; for (int i = 0; i < m_masterPageName_list.size(); i++) { pageLayoutStyle = m_pageLayoutStyle_list[i]; masterPageStyle = m_masterPageStyle_list[i]; Q_ASSERT(pageLayoutStyle); Q_ASSERT(masterPageStyle); //set the margins - depends on whether a header/footer is present // Set default left/right margins for the case when there is no border. // This will be changed below if there are borders defined. pageLayoutStyle->addPropertyPt("fo:margin-left", (double)sep->dxaLeft / 20.0); pageLayoutStyle->addPropertyPt("fo:margin-right", (double)sep->dxaRight / 20.0); // the pgbOffsetFrom variable determines how to calculate the margins and paddings. switch (sep->pgbOffsetFrom) { case pgbFromText: pageLayoutStyle->addPropertyPt("fo:margin-left", sep->dxaLeft / 20.0 - sep->brcLeft.dptSpace); pageLayoutStyle->addPropertyPt("fo:margin-right", sep->dxaRight / 20.0 - sep->brcRight.dptSpace); if (m_hasHeader_list[i]) { // If we have the header in the border, then our margin is the header top position if (m_parser->dop().fIncludeHeader) pageLayoutStyle->addPropertyPt("fo:margin-top", sep->dyaHdrTop / 20.0 - sep->brcTop.dptSpace); else pageLayoutStyle->addPropertyPt("fo:margin-top", (sep->dyaHdrTop + sep->dyaTop) / 20.0 - sep->brcTop.dptSpace); } else { pageLayoutStyle->addPropertyPt("fo:margin-top", sep->dyaTop / 20.0 - sep->brcTop.dptSpace); } if (m_hasFooter_list[i]) { // If we have the footer in the border, then our margin is the header bottom position if (m_parser->dop().fIncludeFooter) pageLayoutStyle->addPropertyPt("fo:margin-bottom", sep->dyaHdrBottom / 20.0 - sep->brcBottom.dptSpace); else pageLayoutStyle->addPropertyPt("fo:margin-bottom", (sep->dyaHdrBottom + sep->dyaBottom) / 20.0 - sep->brcBottom.dptSpace); } else { // same comment for footer as for header pageLayoutStyle->addPropertyPt("fo:margin-bottom", sep->dyaBottom / 20.0 - sep->brcBottom.dptSpace); } pageLayoutStyle->addPropertyPt("fo:padding-left", sep->brcLeft.dptSpace); pageLayoutStyle->addPropertyPt("fo:padding-right", sep->brcRight.dptSpace); pageLayoutStyle->addPropertyPt("fo:padding-top", sep->brcTop.dptSpace); pageLayoutStyle->addPropertyPt("fo:padding-bottom", sep->brcBottom.dptSpace); break; case pgbFromEdge: pageLayoutStyle->addPropertyPt("fo:margin-left", sep->brcLeft.dptSpace); pageLayoutStyle->addPropertyPt("fo:margin-right", sep->brcRight.dptSpace); pageLayoutStyle->addPropertyPt("fo:margin-top", sep->brcTop.dptSpace); pageLayoutStyle->addPropertyPt("fo:margin-bottom", sep->brcBottom.dptSpace); pageLayoutStyle->addPropertyPt("fo:padding-left", sep->dxaLeft / 20.0 - sep->brcLeft.dptSpace); pageLayoutStyle->addPropertyPt("fo:padding-right", sep->dxaRight / 20.0 - sep->brcRight.dptSpace); if (m_hasHeader_list[i]) { // minimum height of headers is not yet calculated but should be smth like: // sep->dyaTop - sep->dyaHdrTop pageLayoutStyle->addPropertyPt("fo:padding-top", sep->dyaHdrTop / 20.0 - sep->brcTop.dptSpace); } else { pageLayoutStyle->addPropertyPt("fo:padding-top", sep->dyaTop / 20.0 - sep->brcTop.dptSpace); } if (m_hasFooter_list[i]) { // same comment for footer as for header pageLayoutStyle->addPropertyPt("fo:padding-bottom", sep->dyaHdrBottom / 20.0 - sep->brcBottom.dptSpace); } else { pageLayoutStyle->addPropertyPt("fo:padding-bottom", sep->dyaBottom / 20.0 - sep->brcBottom.dptSpace); } break; } pageLayoutName = m_mainStyles->insert(*pageLayoutStyle, "Mpm"); masterPageStyle->addAttribute("style:page-layout-name", pageLayoutName); m_mainStyles->insert(*masterPageStyle, m_masterPageName_list[i], KoGenStyles::DontAddNumberToName); //delete objects, we've added them to the collection delete masterPageStyle; delete pageLayoutStyle; } //clear lists m_pageLayoutStyle_list.clear(); m_masterPageStyle_list.clear(); m_masterPageName_list.clear(); m_hasHeader_list.clear(); m_hasFooter_list.clear(); //reset header data m_headerCount = 0; }
//create page-layout and master-page void Document::slotSectionFound(wvWare::SharedPtr<const wvWare::Word97::SEP> sep) { kDebug(30513) ; m_omittMasterPage = false; m_useLastMasterPage = false; //does this section require a specific first page bool firstPage = sep->fTitlePage || sep->pgbApplyTo; // ******************************* // page-layout style // ******************************* kDebug(30513) << "preparing page-layout styles"; KoGenStyle* pageLayoutStyle = new KoGenStyle(KoGenStyle::PageLayoutStyle); //set page-layout attributes setPageLayoutStyle(pageLayoutStyle, sep, 0); pageLayoutStyle->setAutoStyleInStylesDotXml(true); //NOTE: Each section may require a new page-layout. If this is not the //case and the header/footer content didn't change, the <style:master-page> //element can be omitted. Except of continuous section break a manual page //break has to be inserted. //TODO: Even page/Odd page section break support //FIXME: missing support for fo:break-before="page" in table properties so //let's omitt the <style:master-page> element only in case of a continuous //section break if ( !firstPage && !headersChanged() && (m_pageLayoutStyle_last == *pageLayoutStyle) ){ // if (sep->bkc != 0) { // textHandler()->set_breakBeforePage(true); // } switch (sep->bkc) { case bkcContinuous: kDebug(30513) << "omitting page-layout & master-page creation"; m_omittMasterPage = true; break; case bkcNewPage: case bkcEvenPage: case bkcOddPage: kDebug(30513) << "using the last defined master-page"; m_useLastMasterPage = true; m_writeMasterPageName = true; break; default: kWarning(30513) << "Warning: section break type (" << sep->bkc << ") NOT SUPPORTED!"; m_omittMasterPage = true; break; } //cleaning required! delete pageLayoutStyle; } else { //save the actual KoGenStyle! m_pageLayoutStyle_last = *pageLayoutStyle; //add data into corresponding lists m_pageLayoutStyle_list.prepend(pageLayoutStyle); } //yeah, we can omitt creation of a new master-page if (m_omittMasterPage || m_useLastMasterPage) { return; } //check if a first-page specific page-layout has to be created if (firstPage) { pageLayoutStyle = new KoGenStyle(KoGenStyle::PageLayoutStyle); //set page-layout attributes for the first page setPageLayoutStyle(pageLayoutStyle, sep, 1); pageLayoutStyle->setAutoStyleInStylesDotXml(true); //add data into corresponding lists m_pageLayoutStyle_list.prepend(pageLayoutStyle); } // ******************************* // master-page style // ******************************* KoGenStyle* masterStyle = new KoGenStyle(KoGenStyle::MasterPageStyle); QString masterStyleName; //NOTE: The first master-page-name has to be "Standard", words has hard //coded that the value of fo:backgroud-color from this style is used for //the entire frameset. if (m_textHandler->sectionNumber() > 1) { masterStyleName.append("MP"); masterStyleName.append(QString::number(m_textHandler->sectionNumber())); } else { masterStyleName.append("Standard"); } masterStyle->addAttribute("style:display-name", masterStyleName); //add data into corresponding lists m_masterPageName_list.prepend(masterStyleName); m_masterPageStyle_list.prepend(masterStyle); //initialize the header/footer list m_hasHeader_list.prepend(false); m_hasFooter_list.prepend(false); //check if a first-page specific master-page has to be created if (firstPage) { masterStyle = new KoGenStyle(KoGenStyle::MasterPageStyle); masterStyleName.clear(); masterStyleName.append("First_Page"); if (m_textHandler->sectionNumber() > 1) { masterStyleName.append(QString::number(m_textHandler->sectionNumber())); } masterStyle->addAttribute("style:display-name", masterStyleName); masterStyle->addAttribute("style:next-style-name", m_masterPageName_list.last()); //add data into corresponding lists m_masterPageName_list.prepend(masterStyleName); m_masterPageStyle_list.prepend(masterStyle); //initialize the header/footer list m_hasHeader_list.prepend(false); m_hasFooter_list.prepend(false); } //required by handlers m_writeMasterPageName = true; //required by this module m_lastMasterPageName = m_masterPageName_list.first(); for (int i = 0; i < m_masterPageName_list.size(); i++) { kDebug(30513) << "prepared master-page style:" << m_masterPageName_list[i]; } }
QString PictureShape::saveStyle(KoGenStyle& style, KoShapeSavingContext& context) const { if(transparency() > 0.0) { style.addProperty("draw:image-opacity", QString("%1%").arg((1.0 - transparency()) * 100.0)); } // this attribute is need to work around a bug in LO 3.4 to make it recognice us as an // image and not just any shape. But we shouldn't produce illegal odf so: only for testing! // style.addAttribute("style:parent-style-name", "dummy"); // Mirroring if (m_mirrorMode != MirrorNone) { QString mode; if (m_mirrorMode & MirrorHorizontal) mode = "horizontal"; else if (m_mirrorMode & MirrorHorizontalOnEven) mode = "horizontal-on-even"; else if (m_mirrorMode & MirrorHorizontalOnOdd) mode = "horizontal-on-odd"; if (m_mirrorMode & MirrorVertical) { if (!mode.isEmpty()) mode += ' '; mode += "vertical"; } style.addProperty("style:mirror", mode); } switch(m_colorMode) { case Standard: style.addProperty("draw:color-mode", "standard"); break; case Greyscale: style.addProperty("draw:color-mode", "greyscale"); break; case Watermark: style.addProperty("draw:color-mode", "watermark"); break; case Mono: style.addProperty("draw:color-mode", "mono"); break; } KoImageData *imageData = qobject_cast<KoImageData*>(userData()); if (imageData != 0) { QSizeF imageSize = imageData->imageSize(); ClippingRect rect = m_clippingRect; rect.normalize(imageSize); rect.bottom = 1.0 - rect.bottom; rect.right = 1.0 - rect.right; if (!qFuzzyCompare(rect.left + rect.right + rect.top + rect.bottom, qreal(0))) { style.addProperty("fo:clip", QString("rect(%1pt, %2pt, %3pt, %4pt)") .arg(rect.top * imageSize.height()) .arg(rect.right * imageSize.width()) .arg(rect.bottom * imageSize.height()) .arg(rect.left * imageSize.width()) ); } } return KoTosContainer::saveStyle(style, context); }