krita
kis_paintop.cc00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "qwidget.h"
00023 #include "kis_painter.h"
00024 #include "kis_layer.h"
00025 #include "kis_types.h"
00026 #include "kis_paintop.h"
00027 #include "kis_alpha_mask.h"
00028 #include "kis_point.h"
00029 #include "kis_colorspace.h"
00030 #include "kis_global.h"
00031 #include "kis_iterators_pixel.h"
00032 #include "kis_color.h"
00033
00034 KisPaintOp::KisPaintOp(KisPainter * painter)
00035 : m_dab(0)
00036 {
00037 m_painter = painter;
00038 setSource(painter->device());
00039 }
00040
00041 KisPaintOp::~KisPaintOp()
00042 {
00043 }
00044
00045 KisPaintDeviceSP KisPaintOp::computeDab(KisAlphaMaskSP mask) {
00046 return computeDab(mask, m_painter->device()->colorSpace());
00047 }
00048
00049 KisPaintDeviceSP KisPaintOp::computeDab(KisAlphaMaskSP mask, KisColorSpace *cs)
00050 {
00051
00052
00053
00054
00055
00056
00057
00058 if(!m_dab || m_dab->colorSpace() != cs)
00059 m_dab = new KisPaintDevice(cs, "dab");
00060 Q_CHECK_PTR(m_dab);
00061
00062 KisColor kc = m_painter->paintColor();
00063
00064 KisColorSpace * colorSpace = m_dab->colorSpace();
00065
00066 Q_INT32 pixelSize = colorSpace->pixelSize();
00067
00068 Q_INT32 maskWidth = mask->width();
00069 Q_INT32 maskHeight = mask->height();
00070
00071
00072 kc.convertTo(colorSpace);
00073
00074 KisHLineIteratorPixel hiter = m_dab->createHLineIterator(0, 0, maskWidth, true);
00075 for (int y = 0; y < maskHeight; y++)
00076 {
00077 int x=0;
00078 while(! hiter.isDone())
00079 {
00080
00081 colorSpace->setAlpha(kc.data(), mask->alphaAt(x++, y), 1);
00082 memcpy(hiter.rawData(), kc.data(), pixelSize);
00083 ++hiter;
00084 }
00085 hiter.nextRow();
00086 }
00087
00088 return m_dab;
00089 }
00090
00091 void KisPaintOp::splitCoordinate(double coordinate, Q_INT32 *whole, double *fraction)
00092 {
00093 Q_INT32 i = static_cast<Q_INT32>(coordinate);
00094
00095 if (coordinate < 0) {
00096
00097
00098 i--;
00099 }
00100
00101 double f = coordinate - i;
00102
00103 *whole = i;
00104 *fraction = f;
00105 }
00106
00107 void KisPaintOp::setSource(KisPaintDeviceSP p) {
00108 Q_ASSERT(p);
00109 m_source = p;
00110 }
00111
00112
00113 KisPaintOpSettings* KisPaintOpFactory::settings(QWidget* , const KisInputDevice& ) { return 0; }
|