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