SVN commit 1191384 by langkamp: fix scale for masks BUG:251482 M +13 -0 image/kis_selection_component.h M +40 -5 image/kis_transform_visitor.h M +37 -2 ui/flake/kis_shape_selection.cpp M +5 -0 ui/flake/kis_shape_selection.h --- trunk/koffice/krita/image/kis_selection_component.h #1191383:1191384 @@ -21,6 +21,7 @@ #include class QRect; +class QUndoCommand; class KisSelection; class KRITAIMAGE_EXPORT KisSelectionComponent @@ -36,6 +37,18 @@ virtual void moveX(qint32 x) { Q_UNUSED(x); } virtual void moveY(qint32 y) { Q_UNUSED(y); } + + virtual QUndoCommand* transform(double xscale, double yscale, double xshear, double yshear, double angle, qint32 translatex, qint32 translatey) + { + Q_UNUSED(xscale); + Q_UNUSED(yscale); + Q_UNUSED(xshear); + Q_UNUSED(yshear); + Q_UNUSED(angle); + Q_UNUSED(translatex); + Q_UNUSED(translatey); + return 0; + } }; #endif --- trunk/koffice/krita/image/kis_transform_visitor.h #1191383:1191384 @@ -35,6 +35,12 @@ #include "kis_image.h" #include "kis_paint_device.h" #include "generator/kis_generator_layer.h" +#include "kis_pixel_selection.h" +#include "kis_transparency_mask.h" +#include "kis_selection_mask.h" +#include "kis_transformation_mask.h" +#include "kis_clone_layer.h" +#include "kis_filter_mask.h" class KoUpdater; class KisFilterStrategy; @@ -69,6 +75,7 @@ QUndoCommand* command = layer->transform(m_sx, m_sy, 0.0, 0.0, m_angle, m_tx, m_ty); if (command) undoAdapter->addCommand(command); + visitAll(layer); return true; } @@ -78,6 +85,7 @@ */ bool visit(KisPaintLayer *layer) { transformPaintDevice(layer); + visitAll(layer); return true; } @@ -96,30 +104,37 @@ virtual bool visit(KisAdjustmentLayer* layer) { transformPaintDevice(layer); layer->resetCache(); + visitAll(layer); return true; } bool visit(KisGeneratorLayer* layer) { transformPaintDevice(layer); + visitAll(layer); return true; } bool visit(KisNode*) { return true; } - bool visit(KisCloneLayer*) { + bool visit(KisCloneLayer* layer) { + visitAll(layer); return true; } - bool visit(KisFilterMask*) { + bool visit(KisFilterMask* mask) { + transformMask(mask); return true; } - bool visit(KisTransparencyMask*) { + bool visit(KisTransparencyMask* mask) { + transformMask(mask); return true; } - bool visit(KisTransformationMask*) { + bool visit(KisTransformationMask* mask) { + transformMask(mask); return true; } - bool visit(KisSelectionMask*) { + bool visit(KisSelectionMask* mask) { + transformMask(mask); return true; } @@ -138,6 +153,26 @@ node->setDirty(); } + void transformMask(KisMask* mask) { + KisSelectionSP selection = mask->selection(); + if(selection->hasPixelSelection()) { + KisSelectionTransaction transaction(QString(), m_image, selection); + + KisPaintDeviceSP dev = selection->getOrCreatePixelSelection().data(); + KisTransformWorker tw(dev, m_sx, m_sy, 0.0, 0.0, 0.0, 0.0, m_angle, m_tx, m_ty, m_progress, m_filter, true); + tw.run(); + + transaction.commit(m_image->undoAdapter()); + } + if (selection->hasShapeSelection()) { + QUndoCommand* command = selection->shapeSelection()->transform(m_sx, m_sy, 0.0, 0.0, m_angle, m_tx, m_ty); + if (command) + m_image->undoAdapter()->addCommand(command); + } + + selection->updateProjection(); + } + private: qreal m_sx, m_sy; qint32 m_tx, m_ty; --- trunk/koffice/krita/ui/flake/kis_shape_selection.cpp #1191383:1191384 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007 Sven Langkamp + * Copyright (c) 2010 Sven Langkamp * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include #include +#include #include @@ -44,8 +45,8 @@ #include #include #include +#include - #include "kis_painter.h" #include "kis_paint_device.h" #include "kis_shape_selection_model.h" @@ -53,6 +54,7 @@ #include "kis_selection.h" #include "kis_shape_selection_canvas.h" #include "kis_shape_layer_paste.h" +#include "kis_image_view_converter.h" #include @@ -64,6 +66,7 @@ setShapeId("KisShapeSelection"); setSelectable(false); m_dirty = false; + m_converter = new KisImageViewConverter(image); m_canvas = new KisShapeSelectionCanvas(); m_canvas->shapeManager()->addShape(this); @@ -73,6 +76,7 @@ { m_model->setShapeSelection(0); delete m_canvas; + delete m_converter; } KisShapeSelection::KisShapeSelection(const KisShapeSelection& rhs, KisSelection* selection) @@ -399,5 +403,36 @@ } } +// TODO same code as in shape layer, refactor! +QUndoCommand* KisShapeSelection::transform(double xscale, double yscale, double xshear, double yshear, double angle, qint32 translatex, qint32 translatey) { + Q_UNUSED(xshear); + Q_UNUSED(yshear); + QPointF transF = m_converter->viewToDocument(QPoint(translatex, translatey)); + QList shapes = m_canvas->shapeManager()->shapes(); + if(shapes.isEmpty()) + return 0; + + QTransform matrix; + matrix.translate(transF.x(), transF.y()); + matrix.scale(xscale,yscale); + matrix.rotate(angle*180/M_PI); + + QList oldTransformations; + QList newTransformations; + + // this code won't work if there are shapes, that inherit the transformation from the parent container. + // the chart and tree shapes are examples for that, but they aren't used in krita and there are no other shapes like that. + foreach(const KoShape* shape, shapes) { + QTransform oldTransform = shape->transformation(); + oldTransformations.append(oldTransform); + + + newTransformations.append(oldTransform*matrix); + } + + return new KoShapeTransformCommand(shapes, oldTransformations, newTransformations); +} + + #include "kis_shape_selection.moc" --- trunk/koffice/krita/ui/flake/kis_shape_selection.h #1191383:1191384 @@ -30,6 +30,8 @@ class KoStore; class KisShapeSelectionCanvas; class KisShapeSelectionModel; +class KisImageViewConverter; +class QUndoCommand; /** * The marker class. @@ -75,7 +77,9 @@ void moveX(qint32 x); void moveY(qint32 y); + QUndoCommand* transform(double xscale, double yscale, double xshear, double yshear, double angle, qint32 translatex, qint32 translatey); + protected: virtual void paintComponent(QPainter& painter, const KoViewConverter& converter); @@ -87,6 +91,7 @@ KisImageWSP m_image; QPainterPath m_outline; bool m_dirty; + KisImageViewConverter* m_converter; KisShapeSelectionCanvas* m_canvas; KisShapeSelectionModel* m_model;