Commit 7a1143f3 authored by Patrick Julien's avatar Patrick Julien

Reduce memory consumption by over 80%.

Try to integrate KPixmapIO.
Improve rendering speed.

svn path=/trunk/koffice/; revision=194959
parent 35564112
......@@ -30,7 +30,8 @@ enum KisImageBuilder_Result {
KisImageBuilder_RESULT_BUSY = 150,
KisImageBuilder_RESULT_NO_URI = 200,
KisImageBuilder_RESULT_UNSUPPORTED = 300,
KisImageBuilder_RESULT_INTR = 400
KisImageBuilder_RESULT_INTR = 400,
KisImageBuilder_RESULT_PATH = 500
};
enum KisImageBuilder_Step {
......
......@@ -142,10 +142,15 @@ KisImageBuilder_Result KisImageMagickConverter::decode(const KURL& uri, bool isB
if (isBlob) {
// TODO : Test. Does BlobToImage even work?
Q_ASSERT(uri.isEmpty());
strncpy(ii -> filename, "123", 4);
images = BlobToImage(ii, &m_data[0], m_data.size(), &ei);
} else {
strncpy(ii -> filename, uri.path().latin1(), MaxTextExtent);
strncpy(ii -> filename, uri.path().latin1(), MaxTextExtent - 1);
if (ii -> filename[MaxTextExtent - 1]) {
emit notify(this, KisImageBuilder_STEP_ERROR, 0);
return KisImageBuilder_RESULT_PATH;
}
images = ReadImage(ii, &ei);
}
......@@ -290,7 +295,12 @@ KisImageBuilder_Result KisImageMagickConverter::buildFile(const KURL& uri, KisLa
GetExceptionInfo(&ei);
ii = CloneImageInfo(0);
strncpy(ii -> filename, uri.path().latin1(), MaxTextExtent);
strncpy(ii -> filename, uri.path().latin1(), MaxTextExtent - 1);
if (ii -> filename[MaxTextExtent - 1]) {
emit notify(this, KisImageBuilder_STEP_ERROR, 0);
return KisImageBuilder_RESULT_PATH;
}
if (!layer -> width() || !layer -> height())
return KisImageBuilder_RESULT_EMPTY;
......
......@@ -15,14 +15,15 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <limits.h>
#include <kapplication.h>
#include <kconfig.h>
#include "kis_global.h"
#include "kis_config.h"
namespace {
const Q_INT32 IMG_WIDTH_MAX = QUANTUM_MAX;
const Q_INT32 IMG_HEIGHT_MAX = QUANTUM_MAX;
const Q_INT32 IMG_WIDTH_MAX = USHRT_MAX;
const Q_INT32 IMG_HEIGHT_MAX = USHRT_MAX;
const Q_INT32 IMG_DEFAULT_WIDTH = 512;
const Q_INT32 IMG_DEFAULT_HEIGHT = 512;
}
......
......@@ -71,6 +71,8 @@
#include "builder/kis_builder_subject.h"
#include "builder/kis_builder_monitor.h"
#include "builder/kis_image_magick_converter.h"
#include "strategy/kis_strategy_colorspace.h"
#include "strategy/kis_strategy_colorspace_rgb.h"
#include "tiles/kistilemgr.h"
static const char *CURRENT_DTD_VERSION = "1.3";
......@@ -303,7 +305,7 @@ KisDoc::KisDoc(QWidget *parentWidget, const char *widgetName, QObject *parent, c
m_dcop = 0;
setInstance(KisFactory::global(), true);
m_cmdHistory = 0;
QPixmap::setDefaultOptimization(QPixmap::BestOptim);
// QPixmap::setDefaultOptimization(QPixmap::BestOptim);
m_nserver = 0;
m_pushedClipboard = false;
m_currentMacro = 0;
......@@ -338,14 +340,13 @@ DCOPObject *KisDoc::dcopObject()
bool KisDoc::initDoc()
{
bool ok = false;
QString templ;
QString file;
KoTemplateChooseDia::ReturnType ret;
if (!init())
return false;
ret = KoTemplateChooseDia::choose(KisFactory::global(), templ, "application/x-kra", "*.kra",
i18n("Krita"), KoTemplateChooseDia::NoTemplates, "krita_template");
ret = KoTemplateChooseDia::choose(KisFactory::global(), file, APP_MIMETYPE, "Krita", "*.kra", KoTemplateChooseDia::NoTemplates);
if (ret == KoTemplateChooseDia::Template) {
KisConfig cfg;
......@@ -359,7 +360,7 @@ bool KisDoc::initDoc()
} else if (ret == KoTemplateChooseDia::File) {
KURL url;
url.setPath(templ);
url.setPath(file);
ok = openURL(url);
} else if (ret == KoTemplateChooseDia::Empty) {
if ((ok = slotNewImage()))
......@@ -387,9 +388,18 @@ bool KisDoc::init()
connect(m_cmdHistory, SIGNAL(commandExecuted()), this, SLOT(slotCommandExecuted()));
m_undo = true;
m_nserver = new KisNameServer(i18n("Image %1"), 0);
setupColorspaces();
return true;
}
void KisDoc::setupColorspaces()
{
KisStrategyColorSpaceSP p = new KisStrategyColorSpaceRGB;
m_colorspaces[IMAGE_TYPE_RGB] = p;
m_colorspaces[IMAGE_TYPE_RGBA] = p;
}
QDomDocument KisDoc::saveXML()
{
QDomDocument doc = createDomDocument("DOC", CURRENT_DTD_VERSION);
......@@ -956,7 +966,7 @@ void KisDoc::removeImage(const QString& name)
bool KisDoc::slotNewImage()
{
KisConfig cfg;
KisDlgCreateImg dlg(cfg.maxImgWidth() , cfg.defImgWidth(), cfg.maxImgHeight(), cfg.defImgHeight());
KisDlgCreateImg dlg(cfg.maxImgWidth(), cfg.defImgWidth(), cfg.maxImgHeight(), cfg.defImgHeight());
if (dlg.exec() == QDialog::Accepted) {
QString name;
......@@ -988,17 +998,27 @@ KoView* KisDoc::createViewInstance(QWidget* parent, const char *name)
void KisDoc::paintContent(QPainter& painter, const QRect& rect, bool transparent, double zoomX, double zoomY)
{
Q_INT32 x;
Q_INT32 y;
Q_INT32 x1;
Q_INT32 y1;
Q_INT32 x2;
Q_INT32 y2;
Q_INT32 tileno;
KisSelectionSP selection;
KisStrategyColorSpaceSP colorstate;
if (!m_projection)
m_projection = m_images[0];
if (m_projection) {
QPixmap pixmap;
Q_INT32 x1 = rect.x();
Q_INT32 y1 = rect.y();
Q_INT32 x2 = x1 + rect.width() - 1;
Q_INT32 y2 = y1 + rect.height() - 1;
Q_INT32 tileno;
KisSelectionSP selection;
if (!(colorstate = m_colorspaces[m_projection -> nativeImgType()]))
return;
x1 = CLAMP(rect.x(), 0, m_projection -> width());
y1 = CLAMP(rect.y(), 0, m_projection -> height());
x2 = CLAMP(rect.x() + rect.width(), 0, m_projection -> width());
y2 = CLAMP(rect.y() + rect.height(), 0, m_projection -> height());
if (transparent)
painter.eraseRect(rect);
......@@ -1006,26 +1026,20 @@ void KisDoc::paintContent(QPainter& painter, const QRect& rect, bool transparent
if (zoomX != 1.0 || zoomY != 1.0)
painter.scale(zoomX, zoomY);
for (Q_INT32 y = y1; y <= y2; y += TILE_HEIGHT - (y % TILE_HEIGHT)) {
for (Q_INT32 x = x1; x <= x2; x += TILE_WIDTH - (x % TILE_WIDTH)) {
for (y = y1; y <= y2; y += TILE_HEIGHT - (y % TILE_HEIGHT)) {
for (x = x1; x <= x2; x += TILE_WIDTH - (x % TILE_WIDTH)) {
if ((tileno = m_projection -> tileNum(x, y)) < 0)
continue;
pixmap = m_projection -> pixmap(tileno);
if (!pixmap.isNull()) {
painter.drawPixmap(x, y, pixmap,
(x % TILE_WIDTH),
(y % TILE_HEIGHT),
TILE_WIDTH - (x % TILE_WIDTH),
TILE_HEIGHT - (y % TILE_HEIGHT));
}
}
m_projection -> validate(tileno);
}
}
selection = m_projection -> selection();
for (y = y1; y < y2; y += RENDER_HEIGHT)
for (x = x1; x < x2; x += RENDER_WIDTH)
colorstate -> render(m_projection, painter, x, y, QMIN(x2 - x, RENDER_WIDTH), QMIN(y2 - y, RENDER_HEIGHT));
if (selection) {
if ((selection = m_projection -> selection())) {
QPen pen(Qt::DotLine);
QRect rc = selection -> bounds();
QRect clip = selection -> clip();
......
......@@ -134,6 +134,7 @@ private:
QDomElement saveChannel(QDomDocument& doc, KisChannelSP channel);
KisChannelSP loadChannel(const QDomElement& elem, KisImageSP img);
bool init();
void setupColorspaces();
private:
bool m_undo;
......@@ -146,6 +147,7 @@ private:
KisNameServer *m_nserver;
KMacroCommand *m_currentMacro;
Q_INT32 m_conversionDepth;
KisStrategyColorSpaceMap m_colorspaces;
};
#endif // KIS_DOC_H_
......
......@@ -47,7 +47,7 @@
* on the edge of an canvas are exempt from
* this rule.
*/
const int TILE_SIZE = 128;
const int TILE_SIZE = 64;
/**
* Default width of a tile.
......@@ -62,13 +62,15 @@ const int TILE_HEIGHT = TILE_SIZE;
/**
* Size of a quantum
*/
typedef Q_UINT16 QUANTUM;
typedef Q_UINT8 QUANTUM;
const QUANTUM QUANTUM_MAX = USHRT_MAX;
const QUANTUM QUANTUM_MAX = UCHAR_MAX;
const QUANTUM OPACITY_TRANSPARENT = 0;
const QUANTUM OPACITY_OPAQUE = QUANTUM_MAX;
const QUANTUM MAXCHANNELS = 5;
const Q_INT32 IMG_DEFAULT_DEPTH = 4;
const Q_INT32 RENDER_HEIGHT = TILE_SIZE * 4;
const Q_INT32 RENDER_WIDTH = TILE_SIZE * 4;
enum CompositeOp {
COMPOSITE_UNDEF,
......@@ -123,9 +125,9 @@ const CHANNELTYPE ALPHACHANNEL = 5;
const PIXELTYPE PIXEL_UNDEF = 255;
const PIXELTYPE PIXEL_GRAY = 0;
const PIXELTYPE PIXEL_GRAY_ALPHA = 1;
const PIXELTYPE PIXEL_RED = 0;
const PIXELTYPE PIXEL_RED = 2;
const PIXELTYPE PIXEL_GREEN = 1;
const PIXELTYPE PIXEL_BLUE = 2;
const PIXELTYPE PIXEL_BLUE = 0;
const PIXELTYPE PIXEL_ALPHA = 3;
const PIXELTYPE PIXEL_CYAN = 0;
const PIXELTYPE PIXEL_MAGENTA = 1;
......@@ -137,8 +139,8 @@ const PIXELTYPE PIXEL_INDEXED_ALPHA = 1;
#define CLAMP(x,l,u) ((x)<(l)?(l):((x)>(u)?(u):(x)))
#define downscale(quantum) ((unsigned char) ((quantum)/257UL))
#define upscale(value) ((QUANTUM) (257UL*(value)))
#define downscale(quantum) (quantum) //((unsigned char) ((quantum)/257UL))
#define upscale(value) (value) // ((QUANTUM) (257UL*(value)))
Q_INT32 imgTypeDepth(const enumImgType& type);
bool imgTypeHasAlpha(const enumImgType& type);
......
......@@ -24,7 +24,6 @@
#include <kcommand.h>
#include <kdebug.h>
#include <klocale.h>
#include <kpixmapio.h>
#include "KIsImageIface.h"
#include "kis_image.h"
#include "kis_paint_device.h"
......@@ -151,7 +150,6 @@ KisImage::KisImage(const KisImage& rhs) : QObject(), KisRenderInterface(rhs)
m_shadow = new KisTileMgr(*rhs.m_shadow);
m_bkg = new KisBackground(this, m_width, m_height);
m_projectionPixmaps.resize(m_ntileCols * m_ntileRows);
m_projection = new KisLayer(this, m_width, m_height, "projection", OPACITY_OPAQUE);
m_layers.reserve(rhs.m_layers.size());
......@@ -239,7 +237,6 @@ void KisImage::init(KisDoc *doc, Q_INT32 width, Q_INT32 height, const enumImgTyp
m_undoHistory = 0;
m_ntileCols = (width + TILE_WIDTH - 1) / TILE_WIDTH;
m_ntileRows = (height + TILE_HEIGHT - 1) / TILE_HEIGHT;
m_projectionPixmaps.resize(m_ntileCols * m_ntileRows);
}
void KisImage::resize(Q_INT32 w, Q_INT32 h)
......@@ -251,7 +248,6 @@ void KisImage::resize(Q_INT32 w, Q_INT32 h)
m_height = h;
m_projection = new KisLayer(this, m_width, m_height, "image projection", OPACITY_OPAQUE);
m_bkg = new KisBackground(this, m_width, m_height);
m_projectionPixmaps.clear();
}
void KisImage::resize(const QRect& rc)
......@@ -1005,62 +1001,47 @@ void KisImage::invalidate()
m_projection -> invalidate();
}
QPixmap KisImage::pixmap(Q_INT32 tileNo)
{
KisTileMgrSP tm = m_projection -> data();
KisTileSP src;
Q_ASSERT(tm);
src = tm -> tile(tileNo, TILEMODE_READ);
if (src && src -> valid())
return m_projectionPixmaps[tileNo];
return m_projectionPixmaps[tileNo] = recreatePixmap(tileNo);
}
QPixmap KisImage::recreatePixmap(Q_INT32 tileNo)
void KisImage::validate(Q_INT32 tileno)
{
KisTileMgrSP tm = m_projection -> data();
KisTileSP dst;
KisPainter gc;
QPoint pt;
QPixmap pix;
Q_ASSERT(tm);
if (tileNo < 0)
return QPixmap();
if (tileno < 0)
return;
if (static_cast<Q_UINT32>(tileNo) >= m_projectionPixmaps.size()) {
if (tileno >= (m_ntileCols * m_ntileRows)) {
m_ntileCols = (width() + TILE_WIDTH - 1) / TILE_WIDTH;
m_ntileRows = (height() + TILE_HEIGHT - 1) / TILE_HEIGHT;
m_projectionPixmaps.resize(m_ntileCols * m_ntileRows);
if (static_cast<Q_UINT32>(tileNo) >= m_projectionPixmaps.size())
return QPixmap();
if (tileno >= (m_ntileCols * m_ntileRows))
return;
}
dst = tm -> tile(tileNo, TILEMODE_WRITE);
if (dst -> valid())
return m_projectionPixmaps[tileNo];
dst = tm -> tile(tileno, TILEMODE_WRITE);
if (!dst || dst -> valid())
return;
gc.begin(m_projection.data());
tm -> tileCoord(dst, pt);
gc.bitBlt(pt.x(), pt.y(), COMPOSITE_COPY, m_bkg.data(), pt.x(), pt.y(), dst -> width(), dst -> height());
KisFlatten<flattenAllVisible> visitor(pt.x(), pt.y(), dst -> width(), dst -> height());
if (!m_layers.empty()) {
KisFlatten<flattenAllVisible> visitor(pt.x(), pt.y(), dst -> width(), dst -> height());
visitor(gc, m_layers);
visitor(gc, m_layers);
if (m_selection)
visitor(gc, m_selection);
if (m_selection)
visitor(gc, m_selection);
}
gc.end();
renderProjection(m_projectionPixmaps[tileNo], dst);
// TODO Draw the selection outline
dst -> valid(true);
return m_projectionPixmaps[tileNo];
}
void KisImage::setSelection(KisSelectionSP selection)
......@@ -1118,26 +1099,6 @@ void KisImage::expand(KisPaintDeviceSP dev)
}
}
void KisImage::renderProjection(QPixmap& dst, KisTileSP src)
{
if (!src)
return;
if (dst.width() < src -> width() || dst.height() < src -> height())
dst.resize(src -> width(), src -> height());
if (src) {
QImage image;
src -> lock();
image = src -> convertToImage();
src -> release();
if (!image.isNull())
dst = m_pixmapIO.convertToPixmap(image);
}
}
void KisImage::notify()
{
invalidate(0, 0, width(), height());
......@@ -1166,5 +1127,10 @@ KisDoc* KisImage::document() const
return m_doc;
}
KisTileMgrSP KisImage::tiles() const
{
return m_projection -> data();
}
#include "kis_image.moc"
......@@ -21,8 +21,8 @@
#include <qbitarray.h>
#include <qobject.h>
#include <qstring.h>
#include <qimage.h>
#include <qvaluevector.h>
#include <kpixmapio.h>
#include <kurl.h>
#include <koColor.h>
#include "kis_global.h"
......@@ -36,9 +36,6 @@ class KisPainter;
class KisImage : public QObject, public KisRenderInterface {
Q_OBJECT
typedef QValueVector<QPixmap> vQPixmap;
typedef vQPixmap::iterator vQPixmap_it;
typedef vQPixmap::const_iterator vQPixmap_cit;
public:
KisImage(KisDoc *doc, Q_INT32 width, Q_INT32 height, const enumImgType& imgType, const QString& name);
......@@ -48,12 +45,12 @@ public:
public:
// Implement KisRenderInterface
virtual Q_INT32 tileNum(Q_INT32 xpix, Q_INT32 ypix) const;
virtual void validate(Q_INT32 tileno);
virtual void invalidate(Q_INT32 tileno);
virtual void invalidate(Q_INT32 x, Q_INT32 y, Q_INT32 w, Q_INT32 h);
virtual void invalidate(const QRect& rc);
virtual void invalidate();
virtual QPixmap pixmap(Q_INT32 tileNo);
virtual QPixmap recreatePixmap(Q_INT32 tileNo);
virtual KisTileMgrSP tiles() const;
public:
QString name() const;
......@@ -158,7 +155,6 @@ private:
void expand(KisPaintDeviceSP dev);
void init(KisDoc *doc, Q_INT32 width, Q_INT32 height, const enumImgType& imgType, const QString& name);
PIXELTYPE pixelFromChannel(CHANNELTYPE type) const;
void renderProjection(QPixmap& dst, KisTileSP src);
private:
KCommandHistory *m_undoHistory;
......@@ -177,7 +173,6 @@ private:
bool m_dirty;
KisTileMgrSP m_shadow;
KisBackgroundSP m_bkg;
vQPixmap m_projectionPixmaps;
KisLayerSP m_projection;
vKisLayerSP m_layers;
vKisChannelSP m_channels;
......@@ -193,7 +188,6 @@ private:
bool m_maskInverted;
KoColor m_maskClr;
KisNameServer *m_nserver;
KPixmapIO m_pixmapIO;
KisDoc *m_doc;
};
......
......@@ -164,6 +164,10 @@ Q_INT32 KisPaintDevice::tileNum(Q_INT32, Q_INT32) const
return 0;
}
void KisPaintDevice::validate(Q_INT32)
{
}
void KisPaintDevice::invalidate(Q_INT32 tileno)
{
data() -> invalidate(tileno);
......@@ -193,16 +197,6 @@ void KisPaintDevice::invalidate()
invalidate(0, 0, width(), height());
}
QPixmap KisPaintDevice::pixmap(Q_INT32)
{
return QPixmap();
}
QPixmap KisPaintDevice::recreatePixmap(Q_INT32)
{
return QPixmap();
}
void KisPaintDevice::configure(KisImageSP image, Q_INT32 width, Q_INT32 height, const enumImgType& imgType, const QString& name)
{
if (image == 0 || name.isEmpty())
......@@ -428,7 +422,6 @@ void KisPaintDevice::visible(bool v)
if (m_visible != v) {
m_visible = v;
emit visibilityChanged(this);
update();
}
}
......@@ -724,5 +717,10 @@ bool KisPaintDevice::read(KoStore *store)
return true;
}
KisTileMgrSP KisPaintDevice::tiles() const
{
return m_tiles;
}
#include "kis_paint_device.moc"
......@@ -49,12 +49,12 @@ public:
public:
// Implement KisRenderInterface
virtual Q_INT32 tileNum(Q_INT32 xpix, Q_INT32 ypix) const;
virtual void validate(Q_INT32 tileno);
virtual KisTileMgrSP tiles() const;
virtual void invalidate(Q_INT32 tileno);
virtual void invalidate(Q_INT32 x, Q_INT32 y, Q_INT32 w, Q_INT32 h);
virtual void invalidate(const QRect& rc);
virtual void invalidate();
virtual QPixmap pixmap(Q_INT32);
virtual QPixmap recreatePixmap(Q_INT32);
virtual bool write(KoStore *store);
virtual bool read(KoStore *store);
......
......@@ -246,6 +246,7 @@ void KisPainter::tileBlt(QUANTUM *dst, KisTileSP dsttile, QUANTUM *src, KisTileS
Q_INT32 dststride = dsttile -> width() * dsttile -> depth();
Q_INT32 srcstride = srctile -> width() * srctile -> depth();
Q_INT32 stride = m_device -> image() -> depth();
Q_INT32 linesize = stride * sizeof(QUANTUM) * cols;
QUANTUM *d;
QUANTUM *s;
QUANTUM alpha;
......@@ -256,26 +257,22 @@ void KisPainter::tileBlt(QUANTUM *dst, KisTileSP dsttile, QUANTUM *src, KisTileS
switch (op) {
case COMPOSITE_COPY:
while (rows-- > 0) {
d = dst;
s = src;
for (i = cols; i > 0; i--, d += stride, s += stride)
memcpy(d, s, stride * sizeof(QUANTUM));
d = dst;
s = src;
dst += dststride;
src += srcstride;
while (rows-- > 0) {
memcpy(d, s, linesize);
d += dststride;
s += srcstride;
}
break;
case COMPOSITE_CLEAR:
while (rows-- > 0) {
d = dst;
s = src;
d = dst;
s = src;
for (i = cols; i > 0; i--, d += stride, s += stride)
memset(d, 0, stride * sizeof(QUANTUM));
dst += dststride;
while (rows-- > 0) {
memset(d, 0, linesize);
d += dststride;
}
break;
case COMPOSITE_OVER:
......
......@@ -19,7 +19,7 @@
#define KIS_RENDER_H_
#include <qpixmap.h>
#include <ksharedptr.h>
#include "kis_types.h"
class QRect;
......@@ -32,12 +32,12 @@ public:
public:
virtual Q_INT32 tileNum(Q_INT32 xpix, Q_INT32 ypix) const = 0;
virtual void validate(Q_INT32 tileno) = 0;
virtual void invalidate(Q_INT32 tileno) = 0;
virtual void invalidate(Q_INT32 x, Q_INT32 y, Q_INT32 w, Q_INT32 h) = 0;
virtual void invalidate(const QRect& rc) = 0;
virtual void invalidate() = 0;
virtual QPixmap pixmap(Q_INT32 tileNo) = 0;
virtual QPixmap recreatePixmap(Q_INT32 tileNo) = 0;
virtual KisTileMgrSP tiles() const = 0;
};
inline
......
......@@ -19,6 +19,7 @@
#define KISTYPES_H_
#include <qvaluevector.h>
#include <qmap.h>
#include <ksharedptr.h>
#include <koColor.h>
......@@ -84,5 +85,9 @@ typedef vKisToolSP::const_iterator vKisToolSP_cit;
class KisToolMemento;
typedef KSharedPtr<KisToolMemento> KisToolMementoSP;
class KisStrategyColorSpace;
typedef KSharedPtr<KisStrategyColorSpace> KisStrategyColorSpaceSP;
typedef QMap<Q_INT32, KisStrategyColorSpaceSP> KisStrategyColorSpaceMap;
#endif // KISTYPES_H_
......@@ -432,7 +432,6 @@ void KisView::setupActions()
m_sidebarToggle = new KToggleAction(i18n("Show/Hide Sidebar"), "ok", 0, this, SLOT(showSidebar()), actionCollection(), "show_sidebar");
m_floatsidebarToggle = new KToggleAction(i18n("Dock/Undock Sidebar"), "attach", 0, this, SLOT(floatSidebar()), actionCollection(), "float_sidebar");
m_lsidebarToggle = new KToggleAction(i18n("Left/Right Sidebar"), "view_right", 0, this, SLOT(placeSidebarLeft()), actionCollection(), "left_sidebar");
(void)KStdAction::saveOptions(this, SLOT(saveOptions()), actionCollection(), "save_options");
KStdAction::preferences(this, SLOT(preferences()), actionCollection(), "preferences");
// crayon box toolbar actions - these will be used only
......@@ -1563,15 +1562,6 @@ void KisView::placeSidebarLeft()
resizeEvent(0);
}
/*
saveOptions - here we need to write entries to a congig
file.
*/
void KisView::saveOptions()