You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/krita/core/kis_paint_layer.h

157 lines
5.6 KiB

/*
* Copyright (c) 2005 Casper Boemann <cbr@boemann.dk>
*
* 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 general public license
* along with this program; if not, write to the free software
* foundation, inc., 675 mass ave, cambridge, ma 02139, usa.
*/
#ifndef KIS_PAINT_LAYER_H_
#define KIS_PAINT_LAYER_H_
#include "kis_types.h"
#include "kis_layer.h"
#include "kis_paint_device.h"
#include "kis_colorspace.h"
/**
* This layer is of a type that can be painted on.
*/
class KisPaintLayer : public KisLayer, public KisLayerSupportsIndirectPainting {
typedef KisLayer super;
Q_OBJECT
public:
KisPaintLayer(KisImage *img, const QString& name, Q_UINT8 opacity, KisPaintDeviceSP dev);
KisPaintLayer(KisImage *img, const QString& name, Q_UINT8 opacity);
KisPaintLayer(KisImage *img, const QString& name, Q_UINT8 opacity, KisColorSpace * colorSpace);
KisPaintLayer(const KisPaintLayer& rhs);
virtual ~KisPaintLayer();
virtual KisLayerSP clone() const;
public:
// Called when the layer is made active
virtual void activate() {}
// Called when another layer is made active
virtual void deactivate() {}
virtual Q_INT32 x() const;
virtual void setX(Q_INT32 x);
virtual Q_INT32 y() const;
virtual void setY(Q_INT32 y);
virtual QRect extent() const;
virtual QRect exactBounds() const;
virtual void paintSelection(QImage &img, Q_INT32 x, Q_INT32 y, Q_INT32 w, Q_INT32 h);
virtual void paintSelection(QImage &img, const QRect& scaledImageRect, const QSize& scaledImageSize, const QSize& imageSize);
virtual void paintMaskInactiveLayers(QImage &img, Q_INT32 x, Q_INT32 y, Q_INT32 w, Q_INT32 h);
virtual QImage createThumbnail(Q_INT32 w, Q_INT32 h);
virtual bool accept(KisLayerVisitor &v)
{
// kdDebug(41001) << "\tPAINT\t" << name()
// << " dirty: " << dirty() << "\n";
return v.visit(this);
}
inline KisPaintDeviceSP paintDevice() const { return m_paintdev; }
/// Returns the paintDevice that accompanies this layer (or mask, see editMask)
inline KisPaintDeviceSP paintDeviceOrMask() const {
if (hasMask() && editMask())
return m_mask;
return m_paintdev;
}
// Mask Layer
/// Does this layer have a layer mask?
bool hasMask() const { return m_mask != 0; }
// XXX TODO: Make these undo-able!
/// Create a mask if it does not yet exist, and return it
KisPaintDeviceSP createMask();
/// Convert the from argument to the mask
void createMaskFromPaintDevice(KisPaintDeviceSP from);
/**
* Convert the from selection to a paint device (should convert the getMaskAsSelection
* result back to the mask). Overwrites the current mask, if any. Also removes the selection
*/
void createMaskFromSelection(KisSelectionSP from);
/// Remove the layer mask
void removeMask();
/// Apply the layer mask to the paint device, this removes the mask afterwards
void applyMask();
/// Returns the layer mask's device. Creates one if there is currently none
KisPaintDeviceSP getMask();
/// Returns the layer mask's device, converted to a selection. Creates one if there is currently none
KisSelectionSP getMaskAsSelection();
/// Undoable version of createMask
KNamedCommand* createMaskCommand();
/// Undoable version of createMaskFromSelection
KNamedCommand* maskFromSelectionCommand();
/// Undoable, removes the current mask, but converts it to the current selection
KNamedCommand* maskToSelectionCommand();
/// Undoable version of removeMask
KNamedCommand* removeMaskCommand();
/// Undoable version of applyMask
KNamedCommand* applyMaskCommand();
/// Returns true if the masked part of the mask will be rendered instead of being transparent
bool renderMask() const { return m_renderMask; }
/// Set the renderMask property
void setRenderMask(bool b);
/**
* When this returns true, the KisPaintDevice returned in paintDevice will actually
* be the layer mask (if there is one). This is so that tools can draw on the mask
* without needing to know its existance.
*/
bool editMask() const { return m_editMask; }
/// Sets the editMask property
void setEditMask(bool b);
/// Overridden to call the private convertMaskToSelection
virtual void setDirty(bool propagate = true);
/// Same as above
virtual void setDirty(const QRect & rect, bool propagate = true);
// KisLayerSupportsIndirectPainting
virtual KisLayer* layer() { return this; }
signals:
/// When the mask is created/destroyed or the editmask or rendermask is changed
void sigMaskInfoChanged();
private:
void convertMaskToSelection(const QRect& r);
void genericMaskCreationHelper();
KisPaintDeviceSP m_paintdev;
// Layer mask related:
// XXX It would be nice to merge the next 2 devices...
KisPaintDeviceSP m_mask; // The mask that we can edit and display easily
KisSelectionSP m_maskAsSelection; // The mask as selection, to apply and render easily
bool m_renderMask;
bool m_editMask;
};
typedef KSharedPtr<KisPaintLayer> KisPaintLayerSP;
#endif // KIS_PAINT_LAYER_H_