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.
141 lines
4.7 KiB
141 lines
4.7 KiB
15 years ago
|
/*
|
||
|
* 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_GROUP_LAYER_H_
|
||
|
#define KIS_GROUP_LAYER_H_
|
||
|
|
||
|
#include <ksharedptr.h>
|
||
|
|
||
|
#include "kis_layer.h"
|
||
|
#include "kis_types.h"
|
||
|
|
||
|
#include "kis_paint_layer.h"
|
||
|
|
||
|
class KisMergeVisitor;
|
||
|
|
||
|
/**
|
||
|
* A KisLayer that bundles child layers into a single layer.
|
||
|
* The top layer is firstChild(), with index 0; the bottommost lastChild() with index childCount() - 1.
|
||
|
* KisLayer::nextSibling() moves towards higher indices, from the top to the bottom layer; prevSibling() the reverse.
|
||
|
* (Implementation detail: internally, the indices are reversed, for speed.)
|
||
|
**/
|
||
|
class KisGroupLayer : public KisLayer {
|
||
|
typedef KisLayer super;
|
||
|
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
KisGroupLayer(KisImage *img, const QString &name, Q_UINT8 opacity);
|
||
|
KisGroupLayer(const KisGroupLayer& rhs);
|
||
|
virtual ~KisGroupLayer();
|
||
|
|
||
|
virtual KisLayerSP clone() const;
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
* Set the entire layer extent dirty; this percolates up to parent layers all the
|
||
|
* way to the root layer.
|
||
|
*/
|
||
|
virtual void setDirty(bool propagate = true);
|
||
|
|
||
|
/**
|
||
|
* Add the given rect to the set of dirty rects for this layer;
|
||
|
* this percolates up to parent layers all the way to the root
|
||
|
* layer.
|
||
|
*/
|
||
|
virtual void setDirty(const QRect & rect, bool propagate = true);
|
||
|
|
||
|
virtual void activate() {};
|
||
|
|
||
|
virtual void deactivate() {};
|
||
|
|
||
|
virtual Q_INT32 x() const;
|
||
|
virtual void setX(Q_INT32);
|
||
|
|
||
|
virtual Q_INT32 y() const;
|
||
|
virtual void setY(Q_INT32);
|
||
|
|
||
|
// Sets this layer and all its descendants' owner image to the given image.
|
||
|
virtual void setImage(KisImage *image);
|
||
|
|
||
|
virtual QRect extent() const;
|
||
|
virtual QRect exactBounds() const;
|
||
|
|
||
|
virtual bool accept(KisLayerVisitor &v)
|
||
|
{
|
||
|
// kdDebug(41001) << "GROUP\t\t" << name()
|
||
|
// << " dirty: " << dirty()
|
||
|
// << ", " << m_layers.count() << " children "
|
||
|
// << ", projection: " << m_projection
|
||
|
// << "\n";
|
||
|
return v.visit(this);
|
||
|
};
|
||
|
|
||
|
virtual void resetProjection(KisPaintDevice* to = 0); /// will copy from to, if !0, CoW!!
|
||
|
virtual KisPaintDeviceSP projection(const QRect & rect);
|
||
|
|
||
|
virtual uint childCount() const;
|
||
|
|
||
|
virtual KisLayerSP firstChild() const;
|
||
|
virtual KisLayerSP lastChild() const;
|
||
|
|
||
|
/// Returns the layer at the specified index.
|
||
|
virtual KisLayerSP at(int index) const;
|
||
|
|
||
|
/// Returns the index of the layer if it's in this group, or -1 otherwise.
|
||
|
virtual int index(KisLayerSP layer) const;
|
||
|
|
||
|
/// Moves the specified layer to the specified index in the group, if it's already a member of this group.
|
||
|
virtual void setIndex(KisLayerSP layer, int index);
|
||
|
|
||
|
/** Adds the layer to this group at the specified index. childCount() is a valid index and appends to the end.
|
||
|
Fails and returns false if the layer is already in this group or any other (remove it first.) */
|
||
|
virtual bool addLayer(KisLayerSP newLayer, int index);
|
||
|
|
||
|
/**
|
||
|
* Add the specified layer above the specified layer (if aboveThis == 0, the bottom is used) */
|
||
|
virtual bool addLayer(KisLayerSP newLayer, KisLayerSP aboveThis);
|
||
|
|
||
|
/// Removes the layer at the specified index from the group.
|
||
|
virtual bool removeLayer(int index);
|
||
|
|
||
|
/// Removes the layer from this group. Fails if there's no such layer in this group.
|
||
|
virtual bool removeLayer(KisLayerSP layer);
|
||
|
|
||
|
virtual QImage createThumbnail(Q_INT32 w, Q_INT32 h);
|
||
|
|
||
|
/// Returns if the layer will induce the projection hack (if the only layer in this group)
|
||
|
virtual bool paintLayerInducesProjectionOptimization(KisPaintLayer* l);
|
||
|
signals:
|
||
|
|
||
|
void sigDirty(QRect rc);
|
||
|
|
||
|
private:
|
||
|
|
||
|
void updateProjection(const QRect & rc);
|
||
|
|
||
|
inline int reverseIndex(int index) const { return childCount() - 1 - index; };
|
||
|
vKisLayerSP m_layers; // Contains the list of all layers
|
||
|
KisPaintDeviceSP m_projection; // The cached composition of all layers in this group
|
||
|
|
||
|
Q_INT32 m_x;
|
||
|
Q_INT32 m_y;
|
||
|
};
|
||
|
|
||
|
#endif // KIS_GROUP_LAYER_H_
|
||
|
|