koffice/krita/plugins/paintops/defaultpaintops/smudge

Boudewijn Rempt boud at valdyas.org
Wed Oct 29 10:00:07 CET 2008


SVN commit 877344 by rempt:

Mostly done, except for two really old lines of code I need a 1.6 checkout to check
what they did again -- and then it needs to be tested. Bart, could you check whether 
I did something really wrong here?
CCMAIL: kimageshop at kde.org


 M  +46 -27    kis_smudgeop.cpp  
 M  +8 -0      kis_smudgeop.h  
 M  +2 -3      kis_smudgeop_settings.cpp  
 M  +7 -7      kis_smudgeop_settings_widget.cpp  
 M  +2 -2      kis_smudgeop_settings_widget.h  


--- trunk/koffice/krita/plugins/paintops/defaultpaintops/smudge/kis_smudgeop.cpp #877343:877344
@@ -33,11 +33,12 @@
 #include <QHBoxLayout>
 #include <qtoolbutton.h>
 
-#include <kis_image.h>
 #include <kis_debug.h>
 
+#include <KoColorSpaceRegistry.h>
 #include <KoColorTransformation.h>
 #include <KoColor.h>
+#include <KoCompositeOp.h>
 #include <KoInputDevice.h>
 
 #include <widgets/kcurve.h>
@@ -51,23 +52,28 @@
 #include <kis_selection.h>
 #include <kis_brush_option.h>
 #include <kis_paintop_options_widget.h>
-#include <kis_pressure_darken_option.h>
 #include <kis_pressure_opacity_option.h>
 #include <kis_pressure_size_option.h>
-#include <kis_paint_action_type_option.h>
+#include <kis_pressure_rate_option.h>
 
-#include <kis_smudgeop_settings.h>
-#include <kis_smudgeop_settings_widget.h>
+#include "kis_smudgeop_settings.h"
+#include "kis_smudgeop_settings_widget.h"
 
-
 KisSmudgeOp::KisSmudgeOp(const KisSmudgeOpSettings *settings, KisPainter *painter)
-        : KisBrushBasedPaintOp(painter)
-        , settings(settings)
+    : KisBrushBasedPaintOp(painter)
+    , settings(settings)
+    , m_firstRun( true )
+    , m_target( 0 )
+    , m_srcdev( 0 )
 {
     Q_ASSERT(settings);
     Q_ASSERT(painter);
     Q_ASSERT(settings->m_optionsWidget->m_brushOption);
     m_brush = settings->m_optionsWidget->m_brushOption->brush();
+    m_source = settings->node()->paintDevice();
+    m_srcdev = new KisPaintDevice(m_source->colorSpace(), "duplicate source dev");
+    m_target = new KisPaintDevice(m_source->colorSpace(), "duplicate target dev");
+
 }
 
 KisSmudgeOp::~KisSmudgeOp()
@@ -88,7 +94,7 @@
         return;
 
     KisPaintDeviceSP device = painter()->device();
-    double pScale = KisPaintOp::scaleForPressure(adjustedInfo.pressure());   // TODO: why is there scale and pScale that seems to contains the same things ?
+    double pScale = KisPaintOp::scaleForPressure(adjustedInfo.pressure());
     QPointF hotSpot = brush->hotSpot(pScale, pScale);
     QPointF pt = info.pos() - hotSpot;
 
@@ -106,39 +112,52 @@
     KisPaintDeviceSP dab = KisPaintDeviceSP(0);
 
     quint8 origOpacity = settings->m_optionsWidget->m_opacityOption->apply(painter(), info.pressure());
-    KoColor origColor = settings->m_optionsWidget->m_darkenOption->apply(painter(), info.pressure());
 
     double scale = KisPaintOp::scaleForPressure(adjustedInfo.pressure());
 
     QRect dabRect = QRect(0, 0, brush->maskWidth(scale, 0.0), brush->maskHeight(scale, 0.0));
     QRect dstRect = QRect(x, y, dabRect.width(), dabRect.height());
+    if (dstRect.isNull() || dstRect.isEmpty() || !dstRect.isValid()) return;
 
+    if (brush->brushType() == IMAGE || brush->brushType() == PIPE_IMAGE) {
+        dab = brush->image(device->colorSpace(), pScale, 0.0, adjustedInfo, xFraction, yFraction);
+        dab->convertTo(KoColorSpaceRegistry::instance()->alpha8());
+    } else {
+        dab = cachedDab();
+        KoColor color = painter()->paintColor();
+//        color.convertTo(dab->convertTo(KoColorSpaceRegistry::instance()->alpha8()));
+        brush->mask(dab, color, scale, pScale, 0.0, info, xFraction, yFraction);
+    }
 
-    if (painter()->bounds().isValid()) {
-        dstRect &= painter()->bounds();
+
+    qint32 sw = dab->extent().width();
+    qint32 sh = dab->extent().height();
+
+    int opacity = OPACITY_OPAQUE;
+    if (!m_firstRun) {
+        opacity = settings->m_optionsWidget->m_rateOption->apply( opacity, sw, sh, m_srcdev, adjustedInfo.pressure() );
+    } else {
+        m_firstRun = false;
     }
 
-    if (dstRect.isNull() || dstRect.isEmpty() || !dstRect.isValid()) return;
+    KisPainter copyPainter(m_srcdev);
+    copyPainter.bitBlt(0, 0, COMPOSITE_OVER, device, opacity, pt.x(), pt.y(), sw, sh);
+    copyPainter.end();
 
+    m_target = new KisPaintDevice(device->colorSpace(), "duplicate target dev");
+
+    copyPainter.begin(m_target);
+//    copyPainter.bltSelection(0, 0, COMPOSITE_OVER, m_srcdev, dab, OPACITY_OPAQUE, 0, 0, sw, sh);
+    copyPainter.end();
+
     qint32 sx = dstRect.x() - x;
     qint32 sy = dstRect.y() - y;
-    qint32 sw = dstRect.width();
-    qint32 sh = dstRect.height();
+    sw = dstRect.width();
+    sh = dstRect.height();
 
-    if (brush->brushType() == IMAGE || brush->brushType() == PIPE_IMAGE) {
-        dab = brush->image(device->colorSpace(), scale, 0.0, adjustedInfo, xFraction, yFraction);
-    } else {
-        dab = cachedDab();
-        KoColor color = painter()->paintColor();
-        color.convertTo(dab->colorSpace());
-        brush->mask(dab, color, scale, scale, 0.0, info, xFraction, yFraction);
-    }
+    painter()->bltSelection(dstRect.x(), dstRect.y(), painter()->compositeOp(), m_target, painter()->opacity(), sx, sy, sw, sh);
 
-    painter()->bltSelection(dstRect.x(), dstRect.y(), painter()->compositeOp(), dab, painter()->opacity(), sx, sy, sw, sh);
-
     painter()->setOpacity(origOpacity);
-    painter()->setPaintColor(origColor);
-
 }
 
 double KisSmudgeOp::paintLine(const KisPaintInformation &pi1,
--- trunk/koffice/krita/plugins/paintops/defaultpaintops/smudge/kis_smudgeop.h #877343:877344
@@ -28,6 +28,8 @@
 #include <QDialog>
 #include <KoColorSpace.h>
 
+#include <kis_types.h>
+
 #include <kis_paintop_factory.h>
 #include <kis_paintop_settings.h>
 #include <kis_paintop_options_widget.h>
@@ -62,6 +64,12 @@
 private:
 
     const KisSmudgeOpSettings * settings;
+    bool m_firstRun;
+    KisPaintDeviceSP m_source;
+    KisPaintDeviceSP m_target;
+    KisPaintDeviceSP m_srcdev;
+
+
 };
 
 #endif // KIS_SMUDGEOP_H_
--- trunk/koffice/krita/plugins/paintops/defaultpaintops/smudge/kis_smudgeop_settings.cpp #877343:877344
@@ -25,10 +25,9 @@
 
 #include <kis_brush_option.h>
 #include <kis_paintop_options_widget.h>
-#include <kis_pressure_darken_option.h>
+#include <kis_pressure_rate_option.h>
 #include <kis_pressure_opacity_option.h>
 #include <kis_pressure_size_option.h>
-#include <kis_paint_action_type_option.h>
 
 KisSmudgeOpSettings::KisSmudgeOpSettings( KisSmudgeOpSettingsWidget* widget )
     : KisPaintOpSettings( widget )
@@ -42,7 +41,7 @@
 
 bool KisSmudgeOpSettings::paintIncremental()
 {
-    return m_optionsWidget->m_paintActionTypeOption->paintActionType() == BUILDUP;
+    return false;
 }
 
 void KisSmudgeOpSettings::fromXML(const QDomElement& elt)
--- trunk/koffice/krita/plugins/paintops/defaultpaintops/smudge/kis_smudgeop_settings_widget.cpp #877343:877344
@@ -29,7 +29,7 @@
 #include <kis_pressure_darken_option.h>
 #include <kis_pressure_opacity_option.h>
 #include <kis_pressure_size_option.h>
-#include <kis_paint_action_type_option.h>
+#include <kis_pressure_rate_option.h>
 
 KisSmudgeOpSettingsWidget::KisSmudgeOpSettingsWidget()
 {
@@ -39,13 +39,13 @@
     m_sizeOption = new KisPressureSizeOption();
     m_opacityOption = new KisPressureOpacityOption();
     m_darkenOption = new KisPressureDarkenOption();
-    m_paintActionTypeOption = new KisPaintActionTypeOption();
+    m_rateOption = new KisPressureRateOption();
 
     addPaintOpOption(m_brushOption);
     addPaintOpOption(m_sizeOption);
     addPaintOpOption(m_opacityOption);
     addPaintOpOption(m_darkenOption);
-    addPaintOpOption(m_paintActionTypeOption);
+    addPaintOpOption(m_rateOption);
 
 }
 
@@ -55,7 +55,7 @@
     delete m_sizeOption;
     delete m_opacityOption;
     delete m_darkenOption;
-    delete m_paintActionTypeOption;
+    delete m_rateOption;
 }
 
 void KisSmudgeOpSettingsWidget::setConfiguration( const KisPropertiesConfiguration * config)
@@ -64,7 +64,7 @@
     m_sizeOption->readOptionSetting(config);
     m_opacityOption->readOptionSetting(config);
     m_darkenOption->readOptionSetting(config);
-    m_paintActionTypeOption->readOptionSetting(config);
+    m_rateOption->readOptionSetting(config);
 }
 
 KisPropertiesConfiguration* KisSmudgeOpSettingsWidget::configuration() const
@@ -74,7 +74,7 @@
     m_sizeOption->writeOptionSetting(config);
     m_opacityOption->writeOptionSetting(config);
     m_darkenOption->writeOptionSetting(config);
-    m_paintActionTypeOption->writeOptionSetting(config);
+    m_rateOption->writeOptionSetting(config);
     return config;
 }
 
@@ -85,7 +85,7 @@
     m_sizeOption->writeOptionSetting(config);
     m_opacityOption->writeOptionSetting(config);
     m_darkenOption->writeOptionSetting(config);
-    m_paintActionTypeOption->writeOptionSetting(config);
+    m_rateOption->writeOptionSetting(config);
 }
 
 
--- trunk/koffice/krita/plugins/paintops/defaultpaintops/smudge/kis_smudgeop_settings_widget.h #877343:877344
@@ -29,7 +29,7 @@
 class KisPressureOpacityOption;
 class KisPressureDarkenOption;
 class KisPressureSizeOption;
-class KisPaintActionTypeOption;
+class KisPressureRateOption;
 
 class KisSmudgeOpSettingsWidget : public KisPaintOpOptionsWidget {
 
@@ -54,7 +54,7 @@
     KisPressureOpacityOption * m_opacityOption;
     KisPressureDarkenOption * m_darkenOption;
     KisPressureSizeOption * m_sizeOption;
-    KisPaintActionTypeOption * m_paintActionTypeOption;
+    KisPressureRateOption * m_rateOption;
 
 
 };


More information about the kimageshop mailing list