[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-kimageshop
Subject:    Re: [calligra/krita_selections_no_clipboard_kazakov] krita/image:
From:       Boudewijn Rempt <boud () valdyas ! org>
Date:       2011-05-14 21:34:24
Message-ID: 201105141734.24837.boud () valdyas ! org
[Download RAW message or body]

On Saturday 14 May 2011 May, Dmitry Kazakov wrote:
> Git commit 162695af2661476956c2d8666e15d5e008976f0e by Dmitry Kazakov.
> Committed on 14/05/2011 at 17:55.
> Pushed by dkazakov into branch 'krita_selections_no_clipboard_kazakov'.
> 
> Added ability to crop masks
> 
> There are two hacks right now:
> 1) KisMask does not have an image() pointer. I'm not sure it should
> have, so currently the image pointer is requested through the parent.

No, I don't think so. And please take care: there is no reason on earth why masks or \
nodes should be associated with an image. So if you attempt to retrieve the image, \
always check for 0.


> +    KisImageWSP getImage(KisNode *node) {

It's a long time since we prefixed our getters with "get". This should be called \
"image()". And since it is called only once, it shouldn't be a function, but done \
inline. There is no advantage in clarity by putting this bit of code in its own \
function.

Also -- where is the crop visitor created? 

It's in KisImage and in KisToolCrop. That means that instead of trying to get the \
image from the mask through the layer, you should pass the image as a parameter in \
the constructor of KisCropVisitor and use that. 

So, this getImage method must be removed and replaced by KisImage as a parameter to \
the constructor of KisCropVisitor.


> +        // temporary hack, our masks do not have a link to image.
> +
> +        while (node) {
> +            KisLayer *layer = dynamic_cast<KisLayer*>(node);
> +            if(layer) {
> +                return layer->image();
> +            }
> +            node = node->parent().data();
> +        }
> +        return 0;
> +    }
> 
> -    bool cropPaintDeviceLayer(KisLayer * layer) {
> -        KisUndoAdapter *undoAdapter = layer->image()->undoAdapter();
> -
> -        KisSelectedTransaction transaction(i18n("Crop"), layer);
> -        layer->paintDevice()->crop(m_rect);
> +    /**
> +     * Crops the specified layer and adds the undo information
> +     * to the undo adapter of the layer's image.
> +     */
> +    bool cropPaintDeviceNode(KisNode *node) {
> +        /**
> +         * TODO: implement actual robust cropping of the selections,
> +         * including the cropping of vector (!) selection.
> +         */
> +        KisImageWSP image = getImage(node);
> +        KisUndoAdapter *undoAdapter = image->undoAdapter();
> +
> +        QRect nodeExtent = node->extent();
> +        KisTransaction transaction(i18n("Crop"), node->paintDevice());
> +        node->paintDevice()->crop(m_rect);
> transaction.commit(undoAdapter);
> 
> if (m_movelayers) {
> -            QPoint oldPos(layer->x(), layer->y());
> -            QPoint newPos(layer->x() - m_rect.x(), layer->y() - m_rect.y());
> -            QUndoCommand *cmd = new KisNodeMoveCommand(layer, oldPos, newPos, \
> layer->image()); +            QPoint oldPos(node->x(), node->y());
> +            QPoint newPos(node->x() - m_rect.x(), node->y() - m_rect.y());
> +            QUndoCommand *cmd = new KisNodeMoveCommand(node, oldPos, newPos, \
> image); undoAdapter->addCommand(cmd);
> }
> +
> +        node->setDirty(nodeExtent);
> return true;
> }
> 
> diff --git a/krita/image/tests/kis_crop_visitor_test.cpp \
> b/krita/image/tests/kis_crop_visitor_test.cpp index 0ed890a..b806701 100644
> --- a/krita/image/tests/kis_crop_visitor_test.cpp
> +++ b/krita/image/tests/kis_crop_visitor_test.cpp
> @@ -24,6 +24,7 @@
> #include "kis_image.h"
> #include "kis_paint_device.h"
> #include "kis_fill_painter.h"
> +#include "kis_transparency_mask.h"
> 
> #include "testutil.h"
> 
> @@ -63,6 +64,41 @@ void KisCropVisitorTest::testUndo()
> delete undoAdapterDummy;
> }
> 
> +void KisCropVisitorTest::testCropTransparencyMask()
> +{
> +    const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
> +
> +    TestUtil::KisUndoAdapterDummy* undoAdapterDummy = new \
> TestUtil::KisUndoAdapterDummy(); +    KisImageSP image = new \
> KisImage(undoAdapterDummy, 300, 300, cs, "test", false); +    KisPaintLayerSP layer \
> = new KisPaintLayer(image, "testlayer", OPACITY_OPAQUE_U8); +    KisPaintDeviceSP \
> dev = layer->paintDevice(); +
> +    QRect fillRect(0,0,300,300);
> +    dev->fill(fillRect, KoColor(Qt::white, cs));
> +
> +    KisTransparencyMaskSP mask = new KisTransparencyMask();
> +
> +    image->addNode(layer, image->rootLayer());
> +    image->addNode(mask, layer);
> +
> +    QRect selectionRect(50,50,100,100);
> +
> +    mask->setSelection(new KisSelection());
> +    KisPixelSelectionSP pixelSelection = \
> mask->selection()->getOrCreatePixelSelection(); +    \
> pixelSelection->select(selectionRect, MAX_SELECTED); +
> +    QCOMPARE(pixelSelection->selectedExactRect(), selectionRect);
> +
> +    QRect cropRect(75,75,50,50);
> +
> +    KisCropVisitor visitor(cropRect, false);
> +
> +    mask->accept(visitor);
> +
> +    QCOMPARE(pixelSelection->selectedExactRect(), cropRect);
> +    delete undoAdapterDummy;
> +}
> +
> 
> QTEST_KDEMAIN(KisCropVisitorTest, GUI)
> #include "kis_crop_visitor_test.moc"
> diff --git a/krita/image/tests/kis_crop_visitor_test.h \
> b/krita/image/tests/kis_crop_visitor_test.h index 454a085..65bca36 100644
> --- a/krita/image/tests/kis_crop_visitor_test.h
> +++ b/krita/image/tests/kis_crop_visitor_test.h
> @@ -28,6 +28,7 @@ private slots:
> 
> void testCreation();
> void testUndo();
> +    void testCropTransparencyMask();
> };
> 
> #endif
> 
> 


-- 
Boudewijn Rempt | http://www.valdyas.org, http://www.krita.org
_______________________________________________
kimageshop mailing list
kimageshop@kde.org
https://mail.kde.org/mailman/listinfo/kimageshop


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic