void KisRecordedFilterAction::play(KisNodeSP node, const KisPlayInfo& _info, KoUpdater* _updater) const { KisFilterConfiguration * kfc = d->configuration(); KisPaintDeviceSP dev = node->paintDevice(); KisLayerSP layer = dynamic_cast<KisLayer*>(node.data()); QRect r1 = dev->extent(); KisTransaction transaction(kundo2_i18n("Filter: \"%1\"", d->filter->name()), dev); KisImageWSP image = _info.image(); r1 = r1.intersected(image->bounds()); if (layer && layer->selection()) { r1 = r1.intersected(layer->selection()->selectedExactRect()); } d->filter->process(dev, dev, layer->selection(), r1, kfc, _updater); node->setDirty(r1); transaction.commit(_info.undoAdapter()); }
void KisRecordedPaintAction::play(KisNodeSP node, const KisPlayInfo& info) const { dbgUI << "Play recorded paint action on node : " << node->name() ; KisTransaction * cmd = 0; if (info.undoAdapter()) cmd = new KisTransaction("", node->paintDevice()); KisPaintDeviceSP target = 0; if (d->paintIncremental) { target = node->paintDevice(); } else { target = new KisPaintDevice(node->paintDevice()->colorSpace()); } KisPainter painter(target); KisImageSP image; KisNodeSP parent = node; while (image == 0 && parent->parent()) { // XXX: ugly! KisLayerSP layer = dynamic_cast<KisLayer*>(parent.data()); if (layer) { image = layer->image(); } parent = parent->parent(); } painter.setPaintOpPreset(d->paintOpPreset, image); if (d->paintIncremental) { painter.setCompositeOp(d->compositeOp); painter.setOpacity(d->opacity); } else { painter.setCompositeOp(node->paintDevice()->colorSpace()->compositeOp(COMPOSITE_ALPHA_DARKEN)); painter.setOpacity(OPACITY_OPAQUE); } painter.setPaintColor(d->foregroundColor); painter.setFillColor(d->backgroundColor); playPaint(info, &painter); if (!d->paintIncremental) { KisPainter painter2(node->paintDevice()); painter2.setCompositeOp(d->compositeOp); painter2.setOpacity(d->opacity); QRegion r = painter.dirtyRegion(); QVector<QRect> dirtyRects = r.rects(); QVector<QRect>::iterator it = dirtyRects.begin(); QVector<QRect>::iterator end = dirtyRects.end(); while (it != end) { painter2.bitBlt(it->topLeft(), target, *it); ++it; } node->setDirty(painter2.dirtyRegion()); } else { node->setDirty(painter.dirtyRegion()); } if (info.undoAdapter()) info.undoAdapter()->addCommand(cmd); }