KoFilterEffectStack * FilterEffectResource::toFilterStack() const { KoFilterEffectStack * filterStack = new KoFilterEffectStack(); if (!filterStack) return 0; QByteArray data = m_data.toByteArray(); KoXmlDocument doc; doc.setContent(data); KoXmlElement e = doc.documentElement(); // only allow obect bounding box units if (e.hasAttribute("filterUnits") && e.attribute("filterUnits") != "objectBoundingBox") return 0; if (e.attribute("primitiveUnits") != "objectBoundingBox") return 0; // parse filter region rectangle QRectF filterRegion; filterRegion.setX(fromPercentage(e.attribute("x", "-0.1"))); filterRegion.setY(fromPercentage(e.attribute("y", "-0.1"))); filterRegion.setWidth(fromPercentage(e.attribute("width", "1.2"))); filterRegion.setHeight(fromPercentage(e.attribute("height", "1.2"))); filterStack->setClipRect(filterRegion); KoFilterEffectLoadingContext context(QString("")); KoFilterEffectRegistry * registry = KoFilterEffectRegistry::instance(); // create the filter effects and add them to the shape for (KoXmlNode n = e.firstChild(); !n.isNull(); n = n.nextSibling()) { KoXmlElement primitive = n.toElement(); KoFilterEffect * filterEffect = registry->createFilterEffectFromXml(primitive, context); if (!filterEffect) { qWarning() << "filter effect" << primitive.tagName() << "is not implemented yet"; continue; } // parse subregion qreal x = fromPercentage(primitive.attribute("x", "0")); qreal y = fromPercentage(primitive.attribute("y", "0")); qreal w = fromPercentage(primitive.attribute("width", "1")); qreal h = fromPercentage(primitive.attribute("height", "1")); QRectF subRegion(QPointF(x, y), QSizeF(w, h)); if (primitive.hasAttribute("in")) filterEffect->setInput(0, primitive.attribute("in")); if (primitive.hasAttribute("result")) filterEffect->setOutput(primitive.attribute("result")); filterEffect->setFilterRect(subRegion); filterStack->appendFilterEffect(filterEffect); } return filterStack; }
PictureShape::PictureShape() : KoFrameShape(KoXmlNS::draw, "image") , m_imageCollection(0) , m_mirrorMode(MirrorNone) , m_colorMode(Standard) , m_proxy(this) { setKeepAspectRatio(true); KoFilterEffectStack * effectStack = new KoFilterEffectStack(); effectStack->setClipRect(QRectF(0, 0, 1, 1)); setFilterEffectStack(effectStack); }