diff options
Diffstat (limited to 'kiconedit/kicongrid.cpp')
-rw-r--r-- | kiconedit/kicongrid.cpp | 2263 |
1 files changed, 0 insertions, 2263 deletions
diff --git a/kiconedit/kicongrid.cpp b/kiconedit/kicongrid.cpp deleted file mode 100644 index 0ed49f1e..00000000 --- a/kiconedit/kicongrid.cpp +++ /dev/null @@ -1,2263 +0,0 @@ -/* - TDE Icon Editor - a small graphics drawing program for the TDE. - Copyright (C) 1998 Thomas Tanghus (tanghus@kde.org) - - Includes portions of code from TQt, - Copyright (C) 1992-2000 Trolltech AS. - - 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 the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include <stdlib.h> - -#include <tqpainter.h> -#include <tqwhatsthis.h> -#include <tqscrollview.h> -#include <tqbitmap.h> -#include <tqclipboard.h> -#include <tqdatetime.h> - -#include <kiconloader.h> -#include <kruler.h> -#include <tdelocale.h> -#include <tdemessagebox.h> -#include <kdebug.h> - -#include "kresize.h" -#include "properties.h" -#include "kicongrid.h" -#include "kiconedit.h" -#ifndef PICS_INCLUDED -#include "pics/logo.xpm" -#define PICS_INCLUDED -#endif - -#include <X11/Xos.h> - -void DrawCommand::execute() -{ - oldcolor = *((uint*)image->scanLine(y) + x); - *((uint*)image->scanLine(y) + x) = newcolor; - int cell = y * grid->numCols() + x; - grid->setUndoColor( cell, newcolor, false ); -} - -void DrawCommand::unexecute() -{ - *((uint*)image->scanLine(y) + x) = oldcolor; - int cell = y * grid->numCols() + x; - grid->setUndoColor( cell, oldcolor, false ); -} - -void RepaintCommand::execute() -{ - grid->update( area); -} - -KGridView::KGridView(TQImage *image, KCommandHistory* history, TQWidget *parent, const char *name) -: TQFrame(parent, name) -{ - _corner = 0L; - _hruler = _vruler = 0L; - _grid = 0L; - - acceptdrop = false; - - TDEIconEditProperties *props = TDEIconEditProperties::self(); - - viewport = new TQScrollView(this); - TQ_CHECK_PTR(viewport); - - _grid = new TDEIconEditGrid(image, history, viewport->viewport()); - TQ_CHECK_PTR(_grid); - viewport->addChild(_grid); - _grid->setGrid(props->showGrid()); - _grid->setCellSize(props->gridScale()); - - TQString str = i18n( "Icon draw grid\n\nThe icon grid is the area where" - " you draw the icons.\nYou can zoom in and out using the magnifying" - " glasses on the toolbar.\n(Tip: Hold the magnify button down for a" - " few seconds to zoom to a predefined scale)" ); - TQWhatsThis::add( _grid, str ); - - if(props->bgMode() == FixedPixmap) - { - TQPixmap pix(props->bgPixmap()); - if(pix.isNull()) - { - TQPixmap pmlogo((const char **)logo); - pix = pmlogo; - } - viewport->viewport()->setBackgroundPixmap(pix); - _grid->setBackgroundPixmap(pix); - } - else - { - viewport->viewport()->setBackgroundColor(props->bgColor()); - } - - _corner = new TQFrame(this); - _corner->setFrameStyle(TQFrame::WinPanel | TQFrame::Raised); - - _hruler = new KRuler(Qt::Horizontal, this); - _hruler->setEndLabel(i18n("width")); - _hruler->setOffset( -2 ); - _hruler->setRange(0, 1000); - - _vruler = new KRuler(Qt::Vertical, this); - _vruler->setEndLabel(i18n("height")); - _vruler->setOffset( -2 ); - _vruler->setRange(0, 1000); - - str = i18n( "Rulers\n\nThis is a visual representation of the current" - " cursor position" ); - TQWhatsThis::add( _hruler, str ); - TQWhatsThis::add( _vruler, str ); - - connect(_grid, TQT_SIGNAL(scalingchanged(int)), TQT_SLOT(scalingChange(int))); - connect(_grid, TQT_SIGNAL(sizechanged(int, int)), TQT_SLOT(sizeChange(int, int))); - connect(_grid, TQT_SIGNAL(needPainting()), TQT_SLOT(paintGrid())); - connect( _grid, TQT_SIGNAL(xposchanged(int)), _hruler, TQT_SLOT(slotNewValue(int)) ); - connect( _grid, TQT_SIGNAL(yposchanged(int)), _vruler, TQT_SLOT(slotNewValue(int)) ); - connect(viewport, TQT_SIGNAL(contentsMoving(int, int)), TQT_SLOT(moving(int, int))); - - setSizes(); - TQResizeEvent e(size(), size()); - resizeEvent(&e); -} - -void KGridView::paintGrid() -{ - _grid->update(viewRect()); -} - -void KGridView::setSizes() -{ - if(TDEIconEditProperties::self()->showRulers()) - { - _hruler->setLittleMarkDistance(_grid->scaling()); - _vruler->setLittleMarkDistance(_grid->scaling()); - - _hruler->setMediumMarkDistance(5); - _vruler->setMediumMarkDistance(5); - - _hruler->setBigMarkDistance(10); - _vruler->setBigMarkDistance(10); - - _hruler->setShowTinyMarks(true); - _hruler->setShowLittleMarks(false); - _hruler->setShowMediumMarks(true); - _hruler->setShowBigMarks(true); - _hruler->setShowEndMarks(true); - - _vruler->setShowTinyMarks(true); - _vruler->setShowLittleMarks(false); - _vruler->setShowMediumMarks(true); - _vruler->setShowBigMarks(true); - _vruler->setShowEndMarks(true); - - _hruler->setPixelPerMark(_grid->scaling()); - _vruler->setPixelPerMark(_grid->scaling()); - - _hruler->setMaxValue(_grid->width()+20); - _vruler->setMaxValue(_grid->height()+20); - - _hruler->show(); - _vruler->show(); - - _corner->show(); - //resize(_grid->width()+_vruler->width(), _grid->height()+_hruler->height()); - } - else - { - _hruler->hide(); - _vruler->hide(); - _corner->hide(); - //resize(_grid->size()); - } -} - -void KGridView::sizeChange(int, int) -{ - setSizes(); -} - -void KGridView::moving(int x, int y) -{ - _hruler->setOffset(abs(x)); - _vruler->setOffset(abs(y)); -} - -void KGridView::scalingChange(int) -{ - setSizes(); -} - -void KGridView::setShowRulers(bool mode) -{ - TDEIconEditProperties::self()->setShowRulers( mode ); - setSizes(); - TQResizeEvent e(size(), size()); - resizeEvent(&e); -} - -void KGridView::setAcceptDrop(bool a) -{ - if(a == acceptdrop) return; - acceptdrop = a; - paintDropSite(); -} - -void KGridView::checkClipboard() -{ - _grid->checkClipboard(); -} - -const TQRect KGridView::viewRect() -{ - int x, y, cx, cy; - if(viewport->horizontalScrollBar()->isVisible()) - { - x = viewport->contentsX(); - cx = viewport->viewport()->width(); - } - else - { - x = 0; - cx = viewport->contentsWidth(); - } - - if(viewport->verticalScrollBar()->isVisible()) - { - y = viewport->contentsY(); - cy = viewport->viewport()->height(); - } - else - { - y = 0; - cy = viewport->contentsHeight(); - } - - return TQRect(x, y, cx, cy); -} - -void KGridView::paintDropSite() -{ - TQPainter p; - p.begin( _grid ); - p.setRasterOp (NotROP); - p.drawRect(viewRect()); - p.end(); -} - -void KGridView::paintEvent(TQPaintEvent *) -{ - if(acceptdrop) - paintDropSite(); -} - - -void KGridView::resizeEvent(TQResizeEvent*) -{ - kdDebug(4640) << "KGridView::resizeEvent" << endl; - - setSizes(); - - if(TDEIconEditProperties::self()->showRulers()) - { - _hruler->setGeometry(_vruler->width(), 0, width(), _hruler->height()); - _vruler->setGeometry(0, _hruler->height(), _vruler->width(), height()); - - _corner->setGeometry(0, 0, _vruler->width(), _hruler->height()); - viewport->setGeometry(_corner->width(), _corner->height(), - width()-_corner->width(), height()-_corner->height()); - } - else - viewport->setGeometry(0, 0, width(), height()); -} - - -TDEIconEditGrid::TDEIconEditGrid(TQImage *image, KCommandHistory* h, TQWidget *parent, const char *name) - : KColorGrid(parent, name, 1) -{ - img = image; - history = h; - selected = 0; - m_command = 0; - - // the 42 normal kde colors - there can be an additional - // 18 custom colors in the custom colors palette - for(uint i = 0; i < 42; i++) - iconcolors.append(iconpalette[i]); - - setupImageHandlers(); - btndown = isselecting = ispasting = modified = false; - - img->create(32, 32, 32); - img->setAlphaBuffer(true); - clearImage(img); - - currentcolor = tqRgb(0,0,0)|OPAQUE_MASK; - emit colorSelected(currentcolor); - - setMouseTracking(true); - - setNumRows(32); - setNumCols(32); - fill(TRANSPARENT); - - connect( kapp->clipboard(), TQT_SIGNAL(dataChanged()), TQT_SLOT(checkClipboard())); - connect( h, TQT_SIGNAL(commandExecuted()), this, TQT_SLOT(updatePreviewPixmap() )); - createCursors(); - - TDEIconEditProperties *props = TDEIconEditProperties::self(); - - setTransparencyDisplayType(props->transparencyDisplayType()); - setTransparencySolidColor(props->transparencySolidColor()); - setCheckerboardColor1(props->checkerboardColor1()); - setCheckerboardColor2(props->checkerboardColor2()); - setCheckerboardSize(props->checkerboardSize()); -} - -TDEIconEditGrid::~TDEIconEditGrid() -{ - kdDebug(4640) << "TDEIconEditGrid - destructor: done" << endl; -} - -void TDEIconEditGrid::paintEvent(TQPaintEvent *e) -{ - const TQRect cellsRect(0, 0, numCols() * cellSize(), numRows() * cellSize()); - const TQRect paintCellsRect = cellsRect.intersect(e->rect()); - - if(!paintCellsRect.isEmpty()) - { - //TQTime time; - - //time.start(); - - TQRgb *imageBuffer = new TQRgb[paintCellsRect.width() * paintCellsRect.height()]; - const int cellsize = cellSize(); - const int firstCellPixelsRemaining = cellsize - paintCellsRect.left() % cellsize; - - if(transparencyDisplayType() == TRD_SOLIDCOLOR) - { - const TQRgb backgroundColor = transparencySolidColor().rgb(); - const int backgroundRed = transparencySolidColor().red(); - const int backgroundGreen = transparencySolidColor().green(); - const int backgroundBlue = transparencySolidColor().blue(); - const int firstCellX = paintCellsRect.left() / cellsize; - - for(int y = paintCellsRect.top(); y <= paintCellsRect.bottom(); y++) - { - TQRgb *dest = imageBuffer + (y - paintCellsRect.top()) * paintCellsRect.width(); - - if(y % cellsize == 0 || dest == imageBuffer) - { - // Paint the first scanline in each block of cellSize() identical lines. - // The remaineder can just be copied from this one. - const int cellY = y / cellsize; - TQRgb *src = gridcolors.data() + cellY * numCols() + firstCellX; - - TQRgb sourcePixel = *src++; - int sourceAlpha = tqAlpha(sourcePixel); - - TQRgb c; - - if(sourceAlpha == 255) - { - c = sourcePixel; - } - else - if(sourceAlpha == 0) - { - c = backgroundColor; - } - else - { - const int sourceRed = tqRed(sourcePixel); - const int sourceGreen = tqGreen(sourcePixel); - const int sourceBlue = tqBlue(sourcePixel); - - int r = (sourceAlpha * (sourceRed - backgroundRed)) + 0x80; - r = backgroundRed + ((r + (r >> 8)) >> 8); - - int g = (sourceAlpha * (sourceGreen - backgroundGreen)) + 0x80; - g = backgroundGreen + ((g + (g >> 8)) >> 8); - - int b = (sourceAlpha * (sourceBlue - backgroundBlue)) + 0x80; - b = backgroundBlue + ((b + (b >> 8)) >> 8); - - c = tqRgb(r, g, b); - } - - int cellPixelsRemaining = firstCellPixelsRemaining; - - for(int x = paintCellsRect.left(); x <= paintCellsRect.right(); x++) - { - if(cellPixelsRemaining == 0) - { - cellPixelsRemaining = cellsize; - - // Fetch the next source pixel - sourcePixel = *src++; - sourceAlpha = tqAlpha(sourcePixel); - - if(sourceAlpha == 255) - { - c = sourcePixel; - } - else - if(sourceAlpha == 0) - { - c = backgroundColor; - } - else - { - const int sourceRed = tqRed(sourcePixel); - const int sourceGreen = tqGreen(sourcePixel); - const int sourceBlue = tqBlue(sourcePixel); - - //int r = backgroundRed + (sourceAlpha * (sourceRed - backgroundRed)) / 255; - //int g = backgroundGreen + (sourceAlpha * (sourceGreen - backgroundGreen)) / 255; - //int b = backgroundBlue + (sourceAlpha * (sourceBlue - backgroundBlue)) / 255; - - int r = (sourceAlpha * (sourceRed - backgroundRed)) + 0x80; - r = backgroundRed + ((r + (r >> 8)) >> 8); - - int g = (sourceAlpha * (sourceGreen - backgroundGreen)) + 0x80; - g = backgroundGreen + ((g + (g >> 8)) >> 8); - - int b = (sourceAlpha * (sourceBlue - backgroundBlue)) + 0x80; - b = backgroundBlue + ((b + (b >> 8)) >> 8); - - c = tqRgb(r, g, b); - } - } - - cellPixelsRemaining--; - - *dest++ = c; - } - } - else - { - // Copy the scanline above. - memcpy(dest, dest - paintCellsRect.width(), paintCellsRect.width() * sizeof(TQRgb)); - } - } - } - else - { - int squareSize; - const int fixedPointMultiplier = 4; - - if(checkerboardSize() == CHK_SMALL) - { - squareSize = (cellSize() * fixedPointMultiplier) / 4; - } - else - if(checkerboardSize() == CHK_MEDIUM) - { - squareSize = (cellSize() * fixedPointMultiplier) / 2; - } - else - { - squareSize = (2 * cellSize() * fixedPointMultiplier) / 2; - } - - TQRgb *color1ScanLine = new TQRgb[paintCellsRect.width()]; - TQRgb *color2ScanLine = new TQRgb[paintCellsRect.width()]; - TQRgb *color1Buffer = color1ScanLine; - TQRgb *color2Buffer = color2ScanLine; - - for(int x = paintCellsRect.left(); x <= paintCellsRect.right(); x++) - { - if((((x * fixedPointMultiplier) / squareSize) & 1) == 0) - { - *color1Buffer++ = checkerboardColor1().rgb(); - *color2Buffer++ = checkerboardColor2().rgb(); - } - else - { - *color1Buffer++ = checkerboardColor2().rgb(); - *color2Buffer++ = checkerboardColor1().rgb(); - } - } - - const int firstCellX = paintCellsRect.left() / cellsize; - const int firstCellPixelsRemaining = cellsize - paintCellsRect.left() % cellsize; - int lastCellY = -1; - int lastLineFirstSquareColour = 0; - - for(int y = paintCellsRect.top(); y <= paintCellsRect.bottom(); y++) - { - TQRgb *dest = imageBuffer + (y - paintCellsRect.top()) * paintCellsRect.width(); - const int cellY = y / cellsize; - - int firstSquareColour; - const TQRgb *checkerboardSrc; - - if((((y * fixedPointMultiplier) / squareSize) & 1) == 0) - { - firstSquareColour = 1; - checkerboardSrc = color1ScanLine; - } - else - { - firstSquareColour = 2; - checkerboardSrc = color2ScanLine; - } - - if(cellY == lastCellY && firstSquareColour == lastLineFirstSquareColour) - { - // Copy the scanline above. - memcpy(dest, dest - paintCellsRect.width(), paintCellsRect.width() * sizeof(TQRgb)); - } - else - { - TQRgb *src = gridcolors.data() + cellY * numCols() + firstCellX; - - TQRgb sourcePixel = *src++; - int sourceRed = tqRed(sourcePixel); - int sourceGreen = tqGreen(sourcePixel); - int sourceBlue = tqBlue(sourcePixel); - int sourceAlpha = tqAlpha(sourcePixel); - - int cellPixelsRemaining = firstCellPixelsRemaining; - - for(int x = paintCellsRect.left(); x <= paintCellsRect.right(); x++) - { - if(cellPixelsRemaining == 0) - { - cellPixelsRemaining = cellsize; - - // Fetch the next source pixel - sourcePixel = *src++; - sourceRed = tqRed(sourcePixel); - sourceGreen = tqGreen(sourcePixel); - sourceBlue = tqBlue(sourcePixel); - sourceAlpha = tqAlpha(sourcePixel); - } - - cellPixelsRemaining--; - - TQRgb c; - - if(sourceAlpha == 255) - { - c = sourcePixel; - } - else - if(sourceAlpha == 0) - { - c = *checkerboardSrc; - } - else - { - const int backgroundColor = *checkerboardSrc; - const int backgroundRed = tqRed(backgroundColor); - const int backgroundGreen = tqGreen(backgroundColor); - const int backgroundBlue = tqBlue(backgroundColor); - - //int r = backgroundRed + (sourceAlpha * (sourceRed - backgroundRed)) / 255; - //int g = backgroundGreen + (sourceAlpha * (sourceGreen - backgroundGreen)) / 255; - //int b = backgroundBlue + (sourceAlpha * (sourceBlue - backgroundBlue)) / 255; - - int r = (sourceAlpha * (sourceRed - backgroundRed)) + 0x80; - r = backgroundRed + ((r + (r >> 8)) >> 8); - - int g = (sourceAlpha * (sourceGreen - backgroundGreen)) + 0x80; - g = backgroundGreen + ((g + (g >> 8)) >> 8); - - int b = (sourceAlpha * (sourceBlue - backgroundBlue)) + 0x80; - b = backgroundBlue + ((b + (b >> 8)) >> 8); - - c = tqRgb(r, g, b); - } - - *dest++ = c; - checkerboardSrc++; - } - } - - lastCellY = cellY; - lastLineFirstSquareColour = firstSquareColour; - } - - delete [] color1ScanLine; - delete [] color2ScanLine; - } - - TQImage image((uchar *)(imageBuffer), paintCellsRect.width(), paintCellsRect.height(), 32, 0, 0, -#if X_BYTE_ORDER == X_LITTLE_ENDIAN - TQImage::LittleEndian); -#else - TQImage::BigEndian); -#endif - Q_ASSERT(!image.isNull()); - - TQPixmap _pixmap; - _pixmap.convertFromImage(image); - - TQPainter p; - p.begin(&_pixmap); - paintForeground(&p, e); - p.end(); - - bitBlt(this, paintCellsRect.left(), paintCellsRect.top(), &_pixmap); - - //kdDebug(4640) << "Image render elapsed: " << time.elapsed() << endl; - - delete [] imageBuffer; - } -} - -void TDEIconEditGrid::paintForeground(TQPainter* p, TQPaintEvent* e) -{ - TQWMatrix matrix; - - matrix.translate(-e->rect().x(), -e->rect().y()); - p->setWorldMatrix( matrix ); - - TQRect cellsRect(0, 0, numCols() * cellSize(), numRows() * cellSize()); - TQRect paintCellsRect = cellsRect.intersect(e->rect()); - - if(!paintCellsRect.isEmpty()) - { - int firstColumn = paintCellsRect.left() / cellSize(); - int lastColumn = paintCellsRect.right() / cellSize(); - - int firstRow = paintCellsRect.top() / cellSize(); - int lastRow = paintCellsRect.bottom() / cellSize(); - - p->setPen(TQColor(0, 0, 0)); - p->setBrush(TQColor(0, 0, 0)); - - for(int column = firstColumn; column <= lastColumn; column++) - { - for(int row = firstRow; row <= lastRow; row++) - { - int x = column * cellSize(); - int y = row * cellSize(); - - if((ispasting || isselecting) && isMarked(column, row)) - { - p->drawWinFocusRect(x + 1, y + 1, cellSize() - 2, cellSize() - 2); - } - else - { - switch( tool ) - { - case FilledRect: - case Rect: - case Ellipse: - case Circle: - case FilledEllipse: - case FilledCircle: - case Line: - if(btndown && isMarked(column, row)) - { - if(cellSize() > 1) - { - p->drawWinFocusRect( x + 1, y + 1, cellSize() - 2, cellSize() - 2); - } - else - { - p->drawPoint(x, y); - } - } - break; - - default: - break; - } - } - } - } - } - - if(hasGrid()&& !(cellSize()==1)) - { - p->setPen(TQColor(0, 0, 0)); - int x = e->rect().x() - ((e->rect().x() % cellSize()) + cellSize()); - if(x < 0) x = 0; - int y = e->rect().y() - ((e->rect().y() % cellSize()) + cellSize()); - if(y < 0) y = 0; - int cx = e->rect().right() + cellSize(); - int cy = e->rect().bottom() + cellSize(); - - // draw grid lines - for(int i = x; i < cx; i += cellSize()) - p->drawLine(i, y, i, cy); - - for(int i = y; i < cy; i += cellSize()) - p->drawLine(x, i, cx, i); - } -} - -void TDEIconEditGrid::mousePressEvent( TQMouseEvent *e ) -{ - if(!e || (e->button() != Qt::LeftButton)) - return; - - int row = findRow( e->pos().y() ); - int col = findCol( e->pos().x() ); - //int cell = row * numCols() + col; - - if(!img->valid(col, row)) - return; - - btndown = true; - start.setX(col); - start.setY(row); - - if(ispasting) - { - ispasting = false; - editPaste(true); - } - - if(isselecting) - { - TQPointArray a(pntarray.copy()); - pntarray.resize(0); - drawPointArray(a, Mark); - emit selecteddata(false); - } - - switch( tool ) - { - case SelectRect: - case SelectCircle: - isselecting = true; - break; - default: - break; - } -} - -void TDEIconEditGrid::mouseMoveEvent( TQMouseEvent *e ) -{ - if(!e) return; - - int row = findRow( e->pos().y() ); - int col = findCol( e->pos().x() ); - int cell = row * numCols() + col; - - if(img->valid(col, row)) - { - //kdDebug(4640) << col << " X " << row << endl; - emit poschanged(col, row); - // for the rulers - emit xposchanged((col*scaling())+scaling()/2); - emit yposchanged((row*scaling())+scaling()/2); - } - - TQPoint tmpp(col, row); - if(tmpp == end) return; - - // need to use intersection of rectangles to allow pasting - // only that part of clip image which intersects -jwc- - if(ispasting && !btndown && img->valid(col, row)) - { - if( (col + cbsize.width()) > (numCols()-1) ) - insrect.setX(numCols()-insrect.width()); - else - insrect.setX(col); - if( (row + cbsize.height()) > (numRows()-1) ) - insrect.setY(numRows()-insrect.height()); - else - insrect.setY(row); - - insrect.setSize(cbsize); - start = insrect.topLeft(); - end = insrect.bottomRight(); - drawRect(false); - return; - } - - if(!img->valid(col, row) || !btndown) - return; - - end.setX(col); - end.setY(row); - - if(isselecting) - { - if(tool == SelectRect) - drawRect(false); - else - drawEllipse(false); - return; - } - - bool erase=false; - switch( tool ) - { - case Eraser: - erase=true; - - case Freehand: - { - if( !m_command ) - m_command = new KMacroCommand( i18n("Free Hand") ); - - if(erase) - setColor( cell, TRANSPARENT ); - else - setColor( cell, currentcolor ); - - if ( selected != cell ) - { - setModified( true ); - int prevSel = selected; - selected = cell; - TQRect area = TQRect( col*cellsize,row*cellsize, cellsize, cellsize ).unite( - TQRect ( (prevSel%numCols())*cellsize,(prevSel/numCols())*cellsize, cellsize, cellsize ) ); - - m_command->addCommand( new RepaintCommand( area, this ) ); - DrawCommand* dc = new DrawCommand( col, row, colorAt(cell), img, this ); - RepaintCommand* rp = new RepaintCommand( area, this ); - dc->execute(); - rp->execute(); - m_command->addCommand( dc ); - m_command->addCommand( rp ); - } - break; - } - case Find: - { - iconcolors.closestMatch(colorAt(cell)); - if ( selected != cell ) - { - int prevSel = selected; - selected = cell; - update((prevSel%numCols())*cellsize,(prevSel/numCols())*cellsize, cellsize, cellsize); - update(col*cellsize,row*cellsize, cellsize, cellsize); - emit colorSelected(colorAt(selected)); - } - break; - } - case Ellipse: - case Circle: - case FilledEllipse: - case FilledCircle: - { - drawEllipse(false); - break; - } - case FilledRect: - case Rect: - { - drawRect(false); - break; - } - case Line: - { - drawLine(false, false); - break; - } - case Spray: - { - drawSpray(TQPoint(col, row)); - setModified(true); - break; - } - default: - break; - } - - p = *img; - emit changed(TQPixmap(p)); -} - -void TDEIconEditGrid::mouseReleaseEvent( TQMouseEvent *e ) -{ - if(!e || (e->button() != Qt::LeftButton)) - return; - - int row = findRow( e->pos().y() ); - int col = findCol( e->pos().x() ); - btndown = false; - end.setX(col); - end.setY(row); - int cell = row * numCols() + col; - bool erase=false; - switch( tool ) - { - case Eraser: - erase=true; - //currentcolor = TRANSPARENT; - case Freehand: - { - if(!img->valid(col, row)) - return; - if(erase) - setColor( cell, TRANSPARENT ); - else - setColor( cell, currentcolor ); - //if ( selected != cell ) - //{ - setModified( true ); - int prevSel = selected; - selected = cell; - update((prevSel%numCols())*cellsize,(prevSel/numCols())*cellsize, cellsize, cellsize); - update(col*cellsize,row*cellsize, cellsize, cellsize); - //updateCell( prevSel/numCols(), prevSel%numCols(), FALSE ); - //updateCell( row, col, FALSE ); - *((uint*)img->scanLine(row) + col) = colorAt(cell); - p = *img; - //} - - if( m_command ) { - history->addCommand( m_command, false ); - m_command = 0; - } - - break; - } - case Ellipse: - case Circle: - case FilledEllipse: - case FilledCircle: - { - drawEllipse(true); - break; - } - case FilledRect: - case Rect: - { - drawRect(true); - break; - } - case Line: - { - drawLine(true, false); - break; - } - case Spray: - { - drawSpray(TQPoint(col, row)); - break; - } - case FloodFill: - { - TQApplication::setOverrideCursor(waitCursor); - drawFlood(col, row, colorAt(cell)); - TQApplication::restoreOverrideCursor(); - updateColors(); - emit needPainting(); - p = *img; - break; - } - case Find: - { - currentcolor = colorAt(cell); - if ( selected != cell ) - { - int prevSel = selected; - selected = cell; - update((prevSel%numCols())*cellsize,(prevSel/numCols())*cellsize, cellsize, cellsize); - update(col*cellsize,row*cellsize, cellsize, cellsize); - emit colorSelected(currentcolor); - //updateCell( prevSel/numCols(), prevSel%numCols(), FALSE ); - //updateCell( row, col, FALSE ); - } - - break; - } - default: - break; - } - - emit changed(TQPixmap(p)); - //emit colorschanged(numColors(), data()); -} - -//void TDEIconEditGrid::setColorSelection( const TQColor &color ) -void TDEIconEditGrid::setColorSelection( uint c ) -{ - currentcolor = c; - emit colorSelected(currentcolor); -} - -void TDEIconEditGrid::loadBlank( int w, int h ) -{ - img->create(w, h, 32); - img->setAlphaBuffer(true); - clearImage(img); - setNumRows(h); - setNumCols(w); - fill(TRANSPARENT); - emit sizechanged(numCols(), numRows()); - emit colorschanged(numColors(), data()); - history->clear(); -} - - - -void TDEIconEditGrid::load( TQImage *image) -{ - kdDebug(4640) << "TDEIconEditGrid::load" << endl; - - setUpdatesEnabled(false); - - if(image == 0L) - { - TQString msg = i18n("There was an error loading a blank image.\n"); - KMessageBox::error(this, msg); - return; - } - - *img = image->convertDepth(32); - img->setAlphaBuffer(true); - setNumRows(img->height()); - setNumCols(img->width()); - - for(int y = 0; y < numRows(); y++) - { - uint *l = (uint*)img->scanLine(y); - for(int x = 0; x < numCols(); x++, l++) - { - setColor((y*numCols())+x, *l, false); - } - //kdDebug(4640) << "Row: " << y << endl; - kapp->processEvents(200); - } - - updateColors(); - emit sizechanged(numCols(), numRows()); - emit colorschanged(numColors(), data()); - emit changed(pixmap()); - setUpdatesEnabled(true); - emit needPainting(); - //repaint(viewRect(), false); - history->clear(); -} - -const TQPixmap &TDEIconEditGrid::pixmap() -{ - if(!img->isNull()) - p = *img; - //p.convertFromImage(*img, 0); - return(p); -} - -void TDEIconEditGrid::getImage(TQImage *image) -{ - kdDebug(4640) << "TDEIconEditGrid::getImage" << endl; - *image = *img; -} - -bool TDEIconEditGrid::zoomTo(int scale) -{ - TQApplication::setOverrideCursor(waitCursor); - setUpdatesEnabled(false); - setCellSize( scale ); - setUpdatesEnabled(true); - emit needPainting(); - TQApplication::restoreOverrideCursor(); - emit scalingchanged(cellSize()); - - if(scale == 1) - return false; - return true; -} - -bool TDEIconEditGrid::zoom(Direction d) -{ - int f = (d == DirIn) ? (cellSize()+1) : (cellSize()-1); - TQApplication::setOverrideCursor(waitCursor); - setUpdatesEnabled(false); - setCellSize( f ); - setUpdatesEnabled(true); - //emit needPainting(); - TQApplication::restoreOverrideCursor(); - - emit scalingchanged(cellSize()); - if(d == DirOut && cellSize() <= 1) - return false; - return true; -} - -void TDEIconEditGrid::checkClipboard() -{ - bool ok = false; - TQImage tmp = clipboardImage(ok); - if(ok) - emit clipboarddata(true); - else - { - emit clipboarddata(false); - } -} - -TQImage TDEIconEditGrid::clipboardImage(bool &ok) -{ - //###### Remove me later. - //Workaround TQt bug -- check whether format provided first. - //Code below is from TQDragObject, to match the mimetype list.... - - TQStrList fileFormats = TQImageIO::inputFormats(); - fileFormats.first(); - bool oneIsSupported = false; - while ( fileFormats.current() ) - { - TQCString format = fileFormats.current(); - TQCString type = "image/" + format.lower(); - if (kapp->clipboard()->data()->provides(type ) ) - { - oneIsSupported = true; - } - fileFormats.next(); - } - if (!oneIsSupported) - { - ok = false; - return TQImage(); - } - - TQImage image = kapp->clipboard()->image(); - ok = !image.isNull(); - if ( ok ) - { - image = image.convertDepth(32); - image.setAlphaBuffer(true); - } - return image; -} - - -void TDEIconEditGrid::editSelectAll() -{ - start.setX(0); - start.setY(0); - end.setX(numCols()-1); - end.setY(numRows()-1); - isselecting = true; - drawRect(false); - emit newmessage(i18n("All selected")); -} - -void TDEIconEditGrid::editClear() -{ - clearImage(img); - fill(TRANSPARENT); - update(); - setModified(true); - p = *img; - emit changed(p); - emit newmessage(i18n("Cleared")); -} - -TQImage TDEIconEditGrid::getSelection(bool cut) -{ - const TQRect rect = pntarray.boundingRect(); - int nx = 0, ny = 0, nw = 0, nh = 0; - rect.rect(&nx, &ny, &nw, &nh); - - TQImage tmp(nw, nh, 32); - tmp.setAlphaBuffer(true); - clearImage(&tmp); - - int s = pntarray.size(); - - for(int i = 0; i < s; i++) - { - int x = pntarray[i].x(); - int y = pntarray[i].y(); - if(img->valid(x, y) && rect.contains(TQPoint(x, y))) - { - *((uint*)tmp.scanLine(y-ny) + (x-nx)) = *((uint*)img->scanLine(y) + x); - if(cut) - { - *((uint*)img->scanLine(y) + x) = TRANSPARENT; - setColor( (y*numCols()) + x, TRANSPARENT, false ); - } - } - } - - TQPointArray a(pntarray.copy()); - pntarray.resize(0); - drawPointArray(a, Mark); - emit selecteddata(false); - if(cut) - { - updateColors(); - update(rect.x()*cellSize(), rect.y()*cellSize(), - rect.width()*cellSize(), rect.height()*cellSize()); - p = *img; - emit changed(p); - emit colorschanged(numColors(), data()); - emit newmessage(i18n("Selected area cut")); - setModified(true); - } - else - emit newmessage(i18n("Selected area copied")); - - return tmp; -} - -void TDEIconEditGrid::editCopy(bool cut) -{ - kapp->clipboard()->setImage(getSelection(cut)); - isselecting = false; -} - - -void TDEIconEditGrid::editPaste(bool paste) -{ - bool ok = false; - TQImage tmp = clipboardImage(ok); - - TDEIconEditProperties *props = TDEIconEditProperties::self(); - - if(ok) - { - if( (tmp.size().width() > img->size().width()) - || (tmp.size().height() > img->size().height()) ) - { - if(KMessageBox::warningYesNo(this, - i18n("The clipboard image is larger than the current" - " image!\nPaste as new image?"),TQString(),i18n("Paste"), i18n("Do Not Paste")) == 0) - { - editPasteAsNew(); - } - return; - } - else if(!paste) - { - ispasting = true; - cbsize = tmp.size(); - return; - // emit newmessage(i18n("Pasting")); - } - else - { - //kdDebug(4640) << "TDEIconEditGrid: Pasting at: " << insrect.x() << " x " << insrect.y() << endl; - TQApplication::setOverrideCursor(waitCursor); - - for(int y = insrect.y(), ny = 0; y < numRows() && ny < insrect.height(); y++, ny++) - { - uint *l = ((uint*)img->scanLine(y)+insrect.x()); - uint *cl = (uint*)tmp.scanLine(ny); - for(int x = insrect.x(), nx = 0; x < numCols() && nx < insrect.width(); x++, nx++, l++, cl++) - { - if(props->pasteTransparent()) - { - *l = *cl; - } - else - { - // Porter-Duff Over composition - double alphaS = tqAlpha(*cl) / 255.0; - double alphaD = tqAlpha(*l) / 255.0; - - double r = tqRed(*cl) * alphaS + (1 - alphaS) * tqRed(*l) * alphaD; - double g = tqGreen(*cl) * alphaS + (1 - alphaS) * tqGreen(*l) * alphaD; - double b = tqBlue(*cl) * alphaS + (1 - alphaS) * tqBlue(*l) * alphaD; - double a = alphaS + (1 - alphaS) * alphaD; - - // Remove multiplication by alpha - - if(a > 0) - { - r /= a; - g /= a; - b /= a; - } - else - { - r = 0; - g = 0; - b = 0; - } - - int ir = (int)(r + 0.5); - - if(ir < 0) - { - ir = 0; - } - else - if(ir > 255) - { - ir = 255; - } - - int ig = (int)(g + 0.5); - - if(ig < 0) - { - ig = 0; - } - else - if(ig > 255) - { - ig = 255; - } - - int ib = (int)(b + 0.5); - - if(ib < 0) - { - ib = 0; - } - else - if(ib > 255) - { - ib = 255; - } - - int ia = (int)((a * 255) + 0.5); - - if(ia < 0) - { - ia = 0; - } - else - if(ia > 255) - { - ia = 255; - } - - *l = tqRgba(ir, ig, ib, ia); - } - - setColor((y*numCols())+x, (uint)*l, false); - } - } - updateColors(); - update(insrect.x()*cellSize(), insrect.y()*cellSize(), - insrect.width()*cellSize(), insrect.height()*cellSize()); - - TQApplication::restoreOverrideCursor(); - - setModified(true); - p = *img; - emit changed(TQPixmap(p)); - emit sizechanged(numCols(), numRows()); - emit colorschanged(numColors(), data()); - emit newmessage(i18n("Done pasting")); - } - } - else - { - TQString msg = i18n("Invalid pixmap data in clipboard!\n"); - KMessageBox::sorry(this, msg); - } -} - - -void TDEIconEditGrid::editPasteAsNew() -{ - bool ok = false; - TQImage tmp = clipboardImage(ok); - - if(ok) - { - if(isModified()) - { - TDEIconEdit *w = new TDEIconEdit(tmp); - TQ_CHECK_PTR(w); - } - else - { - *img = tmp; - load(img); - setModified(true); - //repaint(viewRect(), false); - - p = *img; - emit changed(TQPixmap(p)); - emit sizechanged(numCols(), numRows()); - emit colorschanged(numColors(), data()); - emit newmessage(i18n("Done pasting")); - history->clear(); - } - } - else - { - TQString msg = i18n("Invalid pixmap data in clipboard!\n"); - KMessageBox::error(this, msg); - } -} - - -void TDEIconEditGrid::editResize() -{ - kdDebug(4640) << "TDEIconGrid::editResize" << endl; - KResizeDialog *rs = new KResizeDialog(this, 0, TQSize(numCols(), numRows())); - if(rs->exec()) - { - const TQSize s = rs->getSize(); - *img = img->smoothScale(s.width(), s.height()); - load(img); - - setModified(true); - } - delete rs; -} - - -void TDEIconEditGrid::setSize(const TQSize s) -{ - kdDebug(4640) << "::setSize: " << s.width() << " x " << s.height() << endl; - - img->create(s.width(), s.height(), 32); - img->setAlphaBuffer(true); - clearImage(img); - load(img); -} - - -void TDEIconEditGrid::createCursors() -{ - TQBitmap mask(22, 22); - TQPixmap pix; - - cursor_normal = TQCursor(arrowCursor); - - pix = BarIcon("colorpicker-cursor"); - if(pix.isNull()) - { - cursor_colorpicker = cursor_normal; - kdDebug(4640) << "TDEIconEditGrid: Error loading colorpicker-cursor.xpm" << endl; - } - else - { - mask = TQPixmap(pix.createHeuristicMask()); - pix.setMask(mask); - cursor_colorpicker = TQCursor(pix, 1, 21); - } - - pix = BarIcon("paintbrush-cursor"); - if(pix.isNull()) - { - cursor_paint = cursor_normal; - kdDebug(4640) << "TDEIconEditGrid: Error loading paintbrush.xpm" << endl; - } - else - { - mask = TQPixmap(pix.createHeuristicMask()); - pix.setMask(mask); - cursor_paint = TQCursor(pix, 0, 19); - } - - pix = BarIcon("fill-cursor"); - if(pix.isNull()) - { - cursor_flood = cursor_normal; - kdDebug(4640) << "TDEIconEditGrid: Error loading fill-cursor.xpm" << endl; - } - else - { - mask = TQPixmap(pix.createHeuristicMask()); - pix.setMask(mask); - cursor_flood = TQCursor(pix, 3, 20); - } - - pix = BarIcon("aim-cursor"); - if(pix.isNull()) - { - cursor_aim = cursor_normal; - kdDebug(4640) << "TDEIconEditGrid: Error loading aim-cursor.xpm" << endl; - } - else - { - mask = TQPixmap(pix.createHeuristicMask()); - pix.setMask(mask); - cursor_aim = TQCursor(pix, 10, 10); - } - - pix = BarIcon("airbrush-cursor"); - if(pix.isNull()) - { - cursor_spray = cursor_normal; - kdDebug(4640) << "TDEIconEditGrid: Error loading airbrush-cursor.xpm" << endl; - } - else - { - mask = TQPixmap(pix.createHeuristicMask(true)); - pix.setMask(mask); - cursor_spray = TQCursor(pix, 0, 20); - } - - pix = BarIcon("eraser-cursor"); - if(pix.isNull()) - { - cursor_erase = cursor_normal; - kdDebug(4640) << "TDEIconEditGrid: Error loading eraser-cursor.xpm" << endl; - } - else - { - mask = TQPixmap(pix.createHeuristicMask(true)); - pix.setMask(mask); - cursor_erase = TQCursor(pix, 1, 16); - } -} - - - -void TDEIconEditGrid::setTool(DrawTool t) -{ - btndown = false; - tool = t; - - if(tool != SelectRect && tool != SelectCircle) - isselecting = false; - - switch( tool ) - { - case SelectRect: - isselecting = true; - setCursor(cursor_aim); - break; - case SelectCircle: - isselecting = true; - setCursor(cursor_aim); - break; - case Line: - case Ellipse: - case Circle: - case FilledEllipse: - case FilledCircle: - case FilledRect: - case Rect: - setCursor(cursor_aim); - break; - case Freehand: - setCursor(cursor_paint); - break; - case Spray: - setCursor(cursor_spray); - break; - case Eraser: - setCursor(cursor_erase); - break; - case FloodFill: - setCursor(cursor_flood); - break; - case Find: - setCursor(cursor_colorpicker); - break; - default: - break; - } -} - - -void TDEIconEditGrid::drawFlood(int x, int y, uint oldcolor) -{ - if((!img->valid(x, y)) - || (colorAt((y * numCols())+x) != oldcolor) - || (colorAt((y * numCols())+x) == currentcolor)) - return; - - *((uint*)img->scanLine(y) + x) = currentcolor; - setColor((y*numCols())+x, currentcolor, false); - - setModified(true); - - drawFlood(x, y-1, oldcolor); - drawFlood(x, y+1, oldcolor); - drawFlood(x-1, y, oldcolor); - drawFlood(x+1, y, oldcolor); - //TODO: add undo -} - - -void TDEIconEditGrid::drawSpray(TQPoint point) -{ - int x = (point.x()-5); - int y = (point.y()-5); - - //kdDebug(4640) << "drawSpray() - " << x << " X " << y << endl; - - pntarray.resize(0); - int points = 0; - for(int i = 1; i < 4; i++, points++) - { - int dx = (rand() % 10); - int dy = (rand() % 10); - pntarray.putPoints(points, 1, x+dx, y+dy); - } - - drawPointArray(pntarray, Draw); -} - - -//This routine is from TQt sources -- it's the branch of TQPointArray::makeEllipse( int x, int y, int w, int h ) that's not normally compiled -//It seems like TDEIconEdit relied on the TQt1 semantics for makeEllipse, which broke -//the tool with reasonably recent TQt versions. -//Thankfully, TQt includes the old code #ifdef'd, which is hence included here -static void TQPA_makeEllipse(TQPointArray& ar, int x, int y, int w, int h ) -{ // midpoint, 1/4 ellipse - if ( w <= 0 || h <= 0 ) { - if ( w == 0 || h == 0 ) { - ar.resize( 0 ); - return; - } - if ( w < 0 ) { // negative width - w = -w; - x -= w; - } - if ( h < 0 ) { // negative height - h = -h; - y -= h; - } - } - int s = (w+h+2)/2; // max size of xx,yy array - int *px = new int[s]; // 1/4th of ellipse - int *py = new int[s]; - int xx, yy, i=0; - double d1, d2; - double a2=(w/2)*(w/2), b2=(h/2)*(h/2); - xx = 0; - yy = int(h/2); - d1 = b2 - a2*(h/2) + 0.25*a2; - px[i] = xx; - py[i] = yy; - i++; - while ( a2*(yy-0.5) > b2*(xx+0.5) ) { // region 1 - if ( d1 < 0 ) { - d1 = d1 + b2*(3.0+2*xx); - xx++; - } else { - d1 = d1 + b2*(3.0+2*xx) + 2.0*a2*(1-yy); - xx++; - yy--; - } - px[i] = xx; - py[i] = yy; - i++; - } - d2 = b2*(xx+0.5)*(xx+0.5) + a2*(yy-1)*(yy-1) - a2*b2; - while ( yy > 0 ) { // region 2 - if ( d2 < 0 ) { - d2 = d2 + 2.0*b2*(xx+1) + a2*(3-2*yy); - xx++; - yy--; - } else { - d2 = d2 + a2*(3-2*yy); - yy--; - } - px[i] = xx; - py[i] = yy; - i++; - } - s = i; - ar.resize( 4*s ); // make full point array - x += w/2; - y += h/2; - for ( i=0; i<s; i++ ) { // mirror - xx = px[i]; - yy = py[i]; - ar.setPoint( s-i-1, x+xx, y-yy ); - ar.setPoint( s+i, x-xx, y-yy ); - ar.setPoint( 3*s-i-1, x-xx, y+yy ); - ar.setPoint( 3*s+i, x+xx, y+yy ); - } - delete[] px; - delete[] py; -} - - - -void TDEIconEditGrid::drawEllipse(bool drawit) -{ - if(drawit) - { - drawPointArray(pntarray, Draw); - p = *img; - emit changed(p); - return; - } - - TQPointArray a(pntarray.copy()); - int x = start.x(), y = start.y(), cx, cy; - - if(x > end.x()) - { - cx = x - end.x(); - x = x - cx; - } - else - cx = end.x() - x; - if(y > end.y()) - { - cy = y - end.y(); - y = y - cy; - } - else - cy = end.y() - y; - - int d = (cx > cy) ? cx : cy; - - //kdDebug(4640) << x << ", " << y << " - " << d << " " << d << endl; - pntarray.resize(0); - drawPointArray(a, Mark); - - if(tool == Circle || tool == FilledCircle || tool == SelectCircle) - TQPA_makeEllipse(pntarray, x, y, d, d); - else if(tool == Ellipse || tool == FilledEllipse) - TQPA_makeEllipse(pntarray, x, y, cx, cy); - - if((tool == FilledEllipse) || (tool == FilledCircle) - || (tool == SelectCircle)) - { - int s = pntarray.size(); - int points = s; - for(int i = 0; i < s; i++) - { - int x = pntarray[i].x(); - int y = pntarray[i].y(); - for(int j = 0; j < s; j++) - { - if((pntarray[j].y() == y) && (pntarray[j].x() > x)) - { - for(int k = x; k < pntarray[j].x(); k++, points++) - pntarray.putPoints(points, 1, k, y); - break; - } - } - } - } - - drawPointArray(pntarray, Mark); - - if(tool == SelectCircle && pntarray.size() > 0 && !ispasting) - emit selecteddata(true); -} - - -void TDEIconEditGrid::drawRect(bool drawit) -{ - if(drawit) - { - drawPointArray(pntarray, Draw); - p = *img; - emit changed(p); - return; - } - - TQPointArray a(pntarray.copy()); - int x = start.x(), y = start.y(), cx, cy; - - if(x > end.x()) - { - cx = x - end.x(); - x = x - cx; - } - else - cx = end.x() - x; - if(y > end.y()) - { - cy = y - end.y(); - y = y - cy; - } - else - cy = end.y() - y; - - //kdDebug(4640) << x << ", " << y << " - " << cx << " " << cy << endl; - pntarray.resize(0); - drawPointArray(a, Mark); // remove previous marking - - int points = 0; - bool pasting = ispasting; - - if(tool == FilledRect || (tool == SelectRect)) - { - for(int i = x; i <= x + (pasting ? cx + 1 : cx); i++) - { - for(int j = y; j <= y+cy; j++, points++) - pntarray.putPoints(points, 1, i, j); - } - } - else - { - for(int i = x; i <= x+cx; i++, points++) - pntarray.putPoints(points, 1, i, y); - for(int i = y; i <= y+cy; i++, points++) - pntarray.putPoints(points, 1, x, i); - for(int i = x; i <= x+cx; i++, points++) - pntarray.putPoints(points, 1, i, y+cy); - for(int i = y; i <= y+cy; i++, points++) - pntarray.putPoints(points, 1, x+cx, i); - } - - drawPointArray(pntarray, Mark); - - if(tool == SelectRect && pntarray.size() > 0 && !ispasting) - emit selecteddata(true); -} - - -void TDEIconEditGrid::drawLine(bool drawit, bool drawStraight) -{ - if(drawit) - { - drawPointArray(pntarray, Draw); - p = *img; - emit changed(p); - return; - } - - TQPointArray a(pntarray.copy()); - pntarray.resize(0); - - // remove previous marking - drawPointArray(a, Mark); - - int x, y, dx, dy, delta; - - dx = end.x() - start.x(); - dy = end.y() - start.y(); - x = start.x(); - y = start.y(); - - delta = TQMAX(abs(dx), abs(dy)); - int deltaX = abs(dx); - int deltaY = abs(dy); - - if ((drawStraight) && (delta > 0)) - { - dx /= delta; - dy /= delta; - - for(int i = 0; i <= delta; i++) - { - pntarray.putPoints(i, 1, x, y); - x += dx; - y += dy; - } - } - - else if ((delta > 0) && (deltaX >= deltaY)) - { - for(int i = 0; i <= deltaX; i++) - { - pntarray.putPoints(i, 1, x, y); - - if(dx > 0) - x++; - else - x--; - - if(dy >= 0) - y = start.y() + (abs(start.x() - x) * deltaY) / deltaX; - else - y = start.y() - (abs(start.x() - x) * deltaY) / deltaX; - } - } - - else if ((delta > 0) && (deltaY > deltaX)) - { - for(int i = 0; i <= deltaY; i++) - { - pntarray.putPoints(i, 1, x, y); - - if(dy > 0) - y++; - else - y--; - - if(dx >= 0) - x = start.x() + (abs(start.y() - y) * deltaX) / deltaY; - else - x = start.x() - (abs(start.y() - y) * deltaX) / deltaY; - } - } - - drawPointArray(pntarray, Mark); -} - - -void TDEIconEditGrid::drawPointArray(TQPointArray a, DrawAction action) -{ - TQRect area( a.boundingRect().x()*cellSize()-1, a.boundingRect().y()*cellSize()-1, - a.boundingRect().width()*cellSize()+1, a.boundingRect().height()*cellSize()+1 ); - - KMacroCommand* macro = 0; - bool doupdate = false; - - if( a.size() > 0 && action == Draw ) { - // might cause a memmory leak, if - // macro is never used and never - // added to the history! TODO: Fix this - macro = new KMacroCommand( i18n("Drawn Array") ); - RepaintCommand* rc = new RepaintCommand( area, this ); - macro->addCommand( rc ); - } - - int s = a.size(); //((rect.size().width()) * (rect.size().height())); - for(int i = 0; i < s; i++) - { - int x = a[i].x(); - int y = a[i].y(); - - if(img->valid(x, y) && TQT_TQRECT_OBJECT(a.boundingRect()).contains(a[ i ])) - { - //kdDebug(4640) << "x: " << x << " - y: " << y << endl; - switch( action ) - { - case Draw: - { - DrawCommand* dc = new DrawCommand( x, y, currentcolor, img, this ); - dc->execute(); - //*((uint*)img->scanLine(y) + x) = currentcolor; //colors[cell]|OPAQUE; - //int cell = y * numCols() + x; - //setColor( cell, currentcolor, false ); - doupdate = true; - //updateCell( y, x, FALSE ); - macro->addCommand( dc ); - break; - } - - case Mark: - case UnMark: - update(x*cellsize,y*cellsize, cellsize, cellsize); - //updateCell( y, x, true ); - break; - - default: - break; - } - } - } - - - if(doupdate) - { - setModified( true ); - updateColors(); - RepaintCommand* rc = new RepaintCommand( area, this ); - rc->execute(); - macro->addCommand( rc ); - pntarray.resize(0); - // add to undo/redo history - history->addCommand( macro, false ); } -} - -void TDEIconEditGrid::updatePreviewPixmap() -{ - p = *img; - emit changed(TQPixmap(p)); -} - - -bool TDEIconEditGrid::isMarked(TQPoint point) -{ - return isMarked(point.x(), point.y()); -} - - -bool TDEIconEditGrid::isMarked(int x, int y) -{ - if(((y * numCols()) + x) == selected) - return true; - - int s = pntarray.size(); - for(int i = 0; i < s; i++) - { - if(y == pntarray[i].y() && x == pntarray[i].x()) - return true; - } - - return false; -} - - -// Fast diffuse dither to 3x3x3 color cube -// Based on TQt's image conversion functions -static bool kdither_32_to_8( const TQImage *src, TQImage *dst ) -{ - register TQRgb *p; - uchar *b; - int y; - - //printf("kconvert_32_to_8\n"); - - if ( !dst->create(src->width(), src->height(), 8, 256) ) { - kdWarning() << "OImage: destination image not valid" << endl; - return FALSE; - } - - int ncols = 256; - - static uint bm[16][16]; - static int init=0; - if (!init) - { - // Build a Bayer Matrix for dithering - init = 1; - int n, i, j; - - bm[0][0]=0; - - for (n=1; n<16; n*=2) - { - for (i=0; i<n; i++) - { - for (j=0; j<n; j++) - { - bm[i][j]*=4; - bm[i+n][j]=bm[i][j]+2; - bm[i][j+n]=bm[i][j]+3; - bm[i+n][j+n]=bm[i][j]+1; - } - } - } - - for (i=0; i<16; i++) - for (j=0; j<16; j++) - bm[i][j]<<=8; - } - - dst->setNumColors( ncols ); - -#define MAX_R 2 -#define MAX_G 2 -#define MAX_B 2 -#define INDEXOF(r,g,b) (((r)*(MAX_G+1)+(g))*(MAX_B+1)+(b)) - - int rc, gc, bc; - - for ( rc=0; rc<=MAX_R; rc++ ) // build 2x2x2 color cube - for ( gc=0; gc<=MAX_G; gc++ ) - for ( bc=0; bc<=MAX_B; bc++ ) - { - dst->setColor( INDEXOF(rc,gc,bc), - tqRgb( rc*255/MAX_R, gc*255/MAX_G, bc*255/MAX_B ) ); - } - - int sw = src->width(); - int* line1[3]; - int* line2[3]; - int* pv[3]; - - line1[0] = new int[src->width()]; - line2[0] = new int[src->width()]; - line1[1] = new int[src->width()]; - line2[1] = new int[src->width()]; - line1[2] = new int[src->width()]; - line2[2] = new int[src->width()]; - pv[0] = new int[sw]; - pv[1] = new int[sw]; - pv[2] = new int[sw]; - - for ( y=0; y < src->height(); y++ ) - { - p = (TQRgb *)src->scanLine(y); - b = dst->scanLine(y); - int endian = (TQImage::systemByteOrder() == TQImage::BigEndian); - int x; - uchar* q = const_cast<TQImage*>(src)->scanLine(y); - uchar* q2 = const_cast<TQImage*>(src)->scanLine(y+1 < src->height() ? y + 1 : 0); - for (int chan = 0; chan < 3; chan++) - { - b = dst->scanLine(y); - int *l1 = (y&1) ? line2[chan] : line1[chan]; - int *l2 = (y&1) ? line1[chan] : line2[chan]; - if ( y == 0 ) - { - for (int i=0; i<sw; i++) - l1[i] = q[i*4+chan+endian]; - } - if ( y+1 < src->height() ) - { - for (int i=0; i<sw; i++) - l2[i] = q2[i*4+chan+endian]; - } - // Bi-directional error diffusion - if ( y&1 ) - { - for (x=0; x<sw; x++) - { - int pix = TQMAX(TQMIN(2, (l1[x] * 2 + 128)/ 255), 0); - int err = l1[x] - pix * 255 / 2; - pv[chan][x] = pix; - - // Spread the error around... - if ( x+1<sw ) - { - l1[x+1] += (err*7)>>4; - l2[x+1] += err>>4; - } - l2[x]+=(err*5)>>4; - if (x>1) - l2[x-1]+=(err*3)>>4; - } - } - else - { - for (x=sw; x-->0; ) - { - int pix = TQMAX(TQMIN(2, (l1[x] * 2 + 128)/ 255), 0); - int err = l1[x] - pix * 255 / 2; - pv[chan][x] = pix; - - // Spread the error around... - if ( x > 0 ) - { - l1[x-1] += (err*7)>>4; - l2[x-1] += err>>4; - } - l2[x]+=(err*5)>>4; - if (x+1 < sw) - l2[x+1]+=(err*3)>>4; - } - } - } - if (endian) - { - for (x=0; x<sw; x++) - { - *b++ = INDEXOF(pv[2][x],pv[1][x],pv[0][x]); - } - } - else - { - for (x=0; x<sw; x++) - { - *b++ = INDEXOF(pv[0][x],pv[1][x],pv[2][x]); - } - } - } - - delete [] line1[0]; - delete [] line2[0]; - delete [] line1[1]; - delete [] line2[1]; - delete [] line1[2]; - delete [] line2[2]; - delete [] pv[0]; - delete [] pv[1]; - delete [] pv[2]; - -#undef MAX_R -#undef MAX_G -#undef MAX_B -#undef INDEXOF - - return TRUE; -} - -// this doesn't work the way it should but the way KPixmap does. -void TDEIconEditGrid::mapToKDEPalette() -{ - TQImage dest; - - kdither_32_to_8(img, &dest); - *img = dest.convertDepth(32); - - for(int y = 0; y < img->height(); y++) - { - uint *l = (uint*)img->scanLine(y); - for(int x = 0; x < img->width(); x++, l++) - { - if(*l < 0xff000000) - { - *l = *l | 0xff000000; - } - } - } - - load(img); - return; - -/* -#if [[[TQT_VERSION IS DEPRECATED]]] > 140 - *img = img->convertDepthWithPalette(32, iconpalette, 42); - load(img); - return; -#endif -*/ - - TQApplication::setOverrideCursor(waitCursor); - for(int y = 0; y < numRows(); y++) - { - uint *l = (uint*)img->scanLine(y); - for(int x = 0; x < numCols(); x++, l++) - { - if(*l != TRANSPARENT) - { - if(!iconcolors.contains(*l)) - *l = iconcolors.closestMatch(*l); - } - } - } - - load(img); - setModified(true); - TQApplication::restoreOverrideCursor(); -} - - -void TDEIconEditGrid::grayScale() -{ - for(int y = 0; y < numRows(); y++) - { - uint *l = (uint*)img->scanLine(y); - for(int x = 0; x < numCols(); x++, l++) - { - if(*l != TRANSPARENT) - { - uint c = tqGray(*l); - *l = tqRgba(c, c, c, tqAlpha(*l)); - } - } - } - - load(img); - setModified(true); -} - - -void TDEIconEditGrid::clearImage(TQImage *image) -{ - if(image->depth() != 32) - { - image->fill(TRANSPARENT); - } - else - { - // TQImage::fill() does not set the alpha channel so do it - // manually. - for(int y = 0; y < image->height(); y++) - { - uint *l = (uint*)image->scanLine(y); - for(int x = 0; x < image->width(); x++, l++) - { - *l = TRANSPARENT; - } - } - } -} - - -void TDEIconEditGrid::setModified(bool m) -{ - if(m != modified) - { - modified = m; - emit modifiedchanged(m); - } -} - - -#include "kicongrid.moc" -// vim: set ts=4: |