diff --git a/libs/image/brushengine/kis_paintop_utils.h b/libs/image/brushengine/kis_paintop_utils.h --- a/libs/image/brushengine/kis_paintop_utils.h +++ b/libs/image/brushengine/kis_paintop_utils.h @@ -156,6 +156,7 @@ qreal extraScale, bool isotropicSpacing, qreal rotation, + bool axesFlipped, qreal spacingVal, bool autoSpacingActive, qreal autoSpacingCoeff, @@ -180,11 +181,12 @@ } spacing = QPointF(significantDimension, significantDimension); rotation = 0.0; + axesFlipped = false; } spacing *= extraScale; - return KisSpacingInformation(spacing, rotation); + return KisSpacingInformation(spacing, rotation, axesFlipped); } } diff --git a/libs/image/kis_distance_information.h b/libs/image/kis_distance_information.h --- a/libs/image/kis_distance_information.h +++ b/libs/image/kis_distance_information.h @@ -36,18 +36,21 @@ explicit KisSpacingInformation() : m_spacing(0.0, 0.0) , m_rotation(0.0) + , m_coordinateSystemFlipped(false) { } explicit KisSpacingInformation(qreal isotropicSpacing) : m_spacing(isotropicSpacing, isotropicSpacing) , m_rotation(0.0) + , m_coordinateSystemFlipped(false) { } - explicit KisSpacingInformation(const QPointF &anisotropicSpacing, qreal rotation) + explicit KisSpacingInformation(const QPointF &anisotropicSpacing, qreal rotation, bool coordinateSystemFlipped) : m_spacing(anisotropicSpacing) , m_rotation(rotation) + , m_coordinateSystemFlipped(coordinateSystemFlipped) { } @@ -64,12 +67,13 @@ } inline qreal rotation() const { - return m_rotation; + return m_coordinateSystemFlipped ? 2 * M_PI - m_rotation : m_rotation; } private: QPointF m_spacing; qreal m_rotation; + bool m_coordinateSystemFlipped; }; /** diff --git a/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp b/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp --- a/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp +++ b/plugins/paintops/defaultpaintops/duplicate/kis_duplicateop.cpp @@ -279,5 +279,5 @@ painter()->renderMirrorMaskSafe(dstRect, m_srcdev, 0, 0, dab, !m_dabCache->needSeparateOriginal()); - return effectiveSpacing(scale, 0.0); + return effectiveSpacing(scale); } diff --git a/plugins/paintops/filterop/kis_filterop.cpp b/plugins/paintops/filterop/kis_filterop.cpp --- a/plugins/paintops/filterop/kis_filterop.cpp +++ b/plugins/paintops/filterop/kis_filterop.cpp @@ -138,5 +138,5 @@ painter()->renderMirrorMaskSafe(dstRect, m_tmpDevice, 0, 0, dab, !m_dabCache->needSeparateOriginal()); - return effectiveSpacing(scale, rotation); + return effectiveSpacing(scale, rotation, info); } diff --git a/plugins/paintops/hatching/kis_hatching_paintop.cpp b/plugins/paintops/hatching/kis_hatching_paintop.cpp --- a/plugins/paintops/hatching/kis_hatching_paintop.cpp +++ b/plugins/paintops/hatching/kis_hatching_paintop.cpp @@ -181,7 +181,7 @@ !m_dabCache->needSeparateOriginal()); painter()->setOpacity(origOpacity); - return effectiveSpacing(scale, 0.0); + return effectiveSpacing(scale); } double KisHatchingPaintOp::spinAngle(double spin) diff --git a/plugins/paintops/libpaintop/kis_brush_based_paintop.h b/plugins/paintops/libpaintop/kis_brush_based_paintop.h --- a/plugins/paintops/libpaintop/kis_brush_based_paintop.h +++ b/plugins/paintops/libpaintop/kis_brush_based_paintop.h @@ -66,7 +66,8 @@ bool checkSizeTooSmall(qreal scale); - KisSpacingInformation effectiveSpacing(qreal scale, qreal rotation) const; + KisSpacingInformation effectiveSpacing(qreal scale) const; + KisSpacingInformation effectiveSpacing(qreal scale, qreal rotation, const KisPaintInformation &pi) const; KisSpacingInformation effectiveSpacing(qreal scale, qreal rotation, const KisPressureSpacingOption &spacingOption, const KisPaintInformation &pi) const; ///Reimplemented, false if brush is 0 @@ -78,7 +79,7 @@ #endif /* HAVE_THREADED_TEXT_RENDERING_WORKAROUND */ private: - KisSpacingInformation effectiveSpacing(qreal dabWidth, qreal dabHeight, qreal extraScale, bool isotropicSpacing, qreal rotation) const; + KisSpacingInformation effectiveSpacing(qreal dabWidth, qreal dabHeight, qreal extraScale, bool isotropicSpacing, qreal rotation, bool axesFlipped) const; protected: // XXX: make private! diff --git a/plugins/paintops/libpaintop/kis_brush_based_paintop.cpp b/plugins/paintops/libpaintop/kis_brush_based_paintop.cpp --- a/plugins/paintops/libpaintop/kis_brush_based_paintop.cpp +++ b/plugins/paintops/libpaintop/kis_brush_based_paintop.cpp @@ -116,30 +116,44 @@ return KisPaintOpUtils::checkSizeTooSmall(scale, m_brush->width(), m_brush->height()); } -KisSpacingInformation KisBrushBasedPaintOp::effectiveSpacing(qreal scale, qreal rotation) const +KisSpacingInformation KisBrushBasedPaintOp::effectiveSpacing(qreal scale) const { // we parse dab rotation separately, so don't count it QSizeF metric = m_brush->characteristicSize(KisDabShape(scale, 1.0, 0)); - return effectiveSpacing(metric.width(), metric.height(), 1.0, false, rotation); + return effectiveSpacing(metric.width(), metric.height(), 1.0, false, 0.0, false); +} + +KisSpacingInformation KisBrushBasedPaintOp::effectiveSpacing(qreal scale, qreal rotation, const KisPaintInformation &pi) const +{ + MirrorProperties prop = m_mirrorOption.apply(pi); + const bool implicitFlipped = prop.horizontalMirror != prop.verticalMirror; + + // we parse dab rotation separately, so don't count it + QSizeF metric = m_brush->characteristicSize(KisDabShape(scale, 1.0, 0)); + return effectiveSpacing(metric.width(), metric.height(), 1.0, false, rotation, implicitFlipped); } KisSpacingInformation KisBrushBasedPaintOp::effectiveSpacing(qreal scale, qreal rotation, const KisPressureSpacingOption &spacingOption, const KisPaintInformation &pi) const { qreal extraSpacingScale = 1.0; if (spacingOption.isChecked()) { extraSpacingScale = spacingOption.apply(pi); } + MirrorProperties prop = m_mirrorOption.apply(pi); + const bool implicitFlipped = prop.horizontalMirror != prop.verticalMirror; + // we parse dab rotation separately, so don't count it QSizeF metric = m_brush->characteristicSize(KisDabShape(scale, 1.0, 0)); - return effectiveSpacing(metric.width(), metric.height(), extraSpacingScale, spacingOption.isotropicSpacing(), rotation); + return effectiveSpacing(metric.width(), metric.height(), extraSpacingScale, spacingOption.isotropicSpacing(), rotation, implicitFlipped); } -KisSpacingInformation KisBrushBasedPaintOp::effectiveSpacing(qreal dabWidth, qreal dabHeight, qreal extraScale, bool isotropicSpacing, qreal rotation) const +KisSpacingInformation KisBrushBasedPaintOp::effectiveSpacing(qreal dabWidth, qreal dabHeight, qreal extraScale, bool isotropicSpacing, qreal rotation, bool axesFlipped) const { return KisPaintOpUtils::effectiveSpacing(dabWidth, dabHeight, extraScale, isotropicSpacing, rotation, + axesFlipped, m_brush->spacing(), m_brush->autoSpacingActive(), m_brush->autoSpacingCoeff(), diff --git a/plugins/paintops/roundmarker/kis_roundmarkerop.cpp b/plugins/paintops/roundmarker/kis_roundmarkerop.cpp --- a/plugins/paintops/roundmarker/kis_roundmarkerop.cpp +++ b/plugins/paintops/roundmarker/kis_roundmarkerop.cpp @@ -75,7 +75,8 @@ // get the scaling factor calculated by the size option const qreal lodScale = KisLodTransform::lodToScale(painter()->device()); const qreal scale = m_sizeOption.apply(info) * lodScale; - const qreal rotation = 0; + const qreal rotation = 0; // TODO + const bool axesFlipped = false; // TODO const qreal diameter = m_markerOption.diameter * scale; qreal radius = 0.5 * diameter; @@ -132,7 +133,7 @@ KisSpacingInformation spacingInfo = KisPaintOpUtils::effectiveSpacing(diameter, diameter, - extraSpacingScale, true, rotation, + extraSpacingScale, true, rotation, axesFlipped, m_markerOption.spacing, m_markerOption.use_auto_spacing, m_markerOption.auto_spacing_coeff,