summaryrefslogtreecommitdiffstats
path: root/chalk/core/kis_image.h
diff options
context:
space:
mode:
Diffstat (limited to 'chalk/core/kis_image.h')
-rw-r--r--chalk/core/kis_image.h461
1 files changed, 461 insertions, 0 deletions
diff --git a/chalk/core/kis_image.h b/chalk/core/kis_image.h
new file mode 100644
index 00000000..4db23d3c
--- /dev/null
+++ b/chalk/core/kis_image.h
@@ -0,0 +1,461 @@
+/*
+ * Copyright (c) 2002 Patrick Julien <freak@codepimps.org>
+ * 2006 Boudewijn Rempt <boud@valdyas.org>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifndef KIS_IMAGE_H_
+#define KIS_IMAGE_H_
+
+#include <tqobject.h>
+#include <tqstring.h>
+#include <tqvaluevector.h>
+#include <tqmutex.h>
+
+#include <config.h>
+
+#include <ksharedptr.h>
+#include <kurl.h>
+
+#include "KoUnit.h"
+
+#include "kis_composite_op.h"
+#include "kis_global.h"
+#include "kis_types.h"
+#include "kis_annotation.h"
+#include "kis_paint_device.h"
+
+#include <koffice_export.h>
+
+
+class DCOPObject;
+class KCommand;
+
+class KoCommandHistory;
+
+class KisColorSpace;
+class KisNameServer;
+class KisUndoAdapter;
+class KisPainter;
+class KCommand;
+class KisColor;
+class KisFilterStrategy;
+class KisImageIface;
+class KisProfile;
+class KisProgressDisplayInterface;
+class KisPaintLayer;
+class KisPerspectiveGrid;
+
+class KRITACORE_EXPORT KisImage : public TQObject, public KShared {
+ Q_OBJECT
+ TQ_OBJECT
+
+public:
+ KisImage(KisUndoAdapter * adapter, TQ_INT32 width, TQ_INT32 height, KisColorSpace * colorSpace, const TQString& name);
+ KisImage(const KisImage& rhs);
+ virtual ~KisImage();
+ virtual DCOPObject *dcopObject();
+
+public:
+ typedef enum enumPaintFlags {
+ PAINT_IMAGE_ONLY = 0,
+ PAINT_BACKGROUND = 1,
+ PAINT_SELECTION = 2,
+ PAINT_MASKINACTIVELAYERS = 4,
+ PAINT_EMBEDDED_RECT = 8 // If the current layer is an embedded part draw a rect around it
+ } PaintFlags;
+
+ /// Paint the specified rect onto the painter, adjusting the colors using the
+ /// given profile. The exposure setting is used if the image has a high dynamic range.
+ virtual void renderToPainter(TQ_INT32 x1,
+ TQ_INT32 y1,
+ TQ_INT32 x2,
+ TQ_INT32 y2,
+ TQPainter &painter,
+ KisProfile *profile,
+ PaintFlags paintFlags,
+ float exposure = 0.0f);
+ /**
+ * Render the projection onto a TQImage. In contrast with the above method, the
+ * selection is not rendered.
+ */
+ virtual TQImage convertToTQImage(TQ_INT32 x1,
+ TQ_INT32 y1,
+ TQ_INT32 x2,
+ TQ_INT32 y2,
+ KisProfile * profile,
+ float exposure = 0.0f);
+
+ virtual TQImage convertToTQImage(const TQRect& r, const TQSize& fullImageSize, KisProfile *profile, PaintFlags paintFlags, float exposure = 0.0f);
+
+ KisBackgroundSP background() const;
+ KisSubstrateSP substrate() const;
+
+
+public:
+
+ /**
+ * Lock the image to make sure no recompositing-causing signals get emitted
+ * while you're messing with the layers. Don't forget to unlock again.
+ */
+ void lock();
+
+ /**
+ * Unlock the image to make sure the rest of Chalk learns about changes in the image
+ * again. If the rootLayer is dirty on unlocking, an imgUpdated signal is sent out
+ * immediately.
+ */
+ void unlock();
+
+ /**
+ * Returns true if the image is locked.
+ */
+ bool locked() const;
+
+ KisColor backgroundColor() const;
+ void setBackgroundColor(const KisColor & color);
+
+ TQString name() const;
+ void setName(const TQString& name);
+
+ TQString description() const;
+ void setDescription(const TQString& description);
+
+ TQString nextLayerName() const;
+ void rollBackLayerName();
+
+ KisPerspectiveGrid* perspectiveGrid();
+ void createPerspectiveGrid(TQPoint topLeft, TQPoint topRight, TQPoint bottomRight, TQPoint bottomLeft);
+ /**
+ * Resize the image to the specified width and height. The resize
+ * method handles the creating on an undo step itself.
+ *
+ * @param w the new width of the image
+ * @param h the new height of the image
+ * @param x the x position of the crop on all layer if cropLayers is true
+ * @param y the y position of the crop on all layer if cropLayers is true
+ * @param cropLayers if true, all layers are cropped to the new size.
+ */
+ void resize(TQ_INT32 w, TQ_INT32 h, TQ_INT32 x = 0, TQ_INT32 y = 0, bool cropLayers = false);
+
+ /**
+ * Resize the image to the specified width and height. The resize
+ * method handles the creating on an undo step itself.
+ *
+ * @param rc the rect describing the new width and height of the image
+ * @param cropLayers if true, all layers are cropped to the new rect
+ */
+ void resize(const TQRect& rc, bool cropLayers = false);
+
+ void scale(double sx, double sy, KisProgressDisplayInterface *m_progress, KisFilterStrategy *filterStrategy);
+ void rotate(double radians, KisProgressDisplayInterface *m_progress);
+ void shear(double angleX, double angleY, KisProgressDisplayInterface *m_progress);
+
+ /**
+ * Convert the image and all its layers to the dstColorSpace
+ */
+ void convertTo(KisColorSpace * dstColorSpace, TQ_INT32 renderingIntent = INTENT_PERCEPTUAL);
+
+ // Get the profile associated with this image
+ KisProfile * getProfile() const;
+
+ /**
+ * Set the profile of the image to the new profile and do the same for
+ * all layers that have the same colorspace and profile as the image.
+ * It doesn't do any pixel conversion.
+ *
+ * This is essential if you have loaded an image that didn't
+ * have an embedded profile to which you want to attach the right profile.
+ */
+
+ void setProfile(const KisProfile * profile);
+
+ /**
+ * Replace the current undo adapter with the specified undo adapter.
+ * The current undo adapter will _not_ be deleted.
+ */
+ void setUndoAdapter(KisUndoAdapter * undoAdapter);
+
+ /**
+ * Returns the current undo adapter. You can add new commands to the
+ * undo stack using the adapter
+ */
+ KisUndoAdapter *undoAdapter() const;
+
+ /**
+ * Returns true if this image wants undo information, false otherwise
+ */
+ bool undo() const;
+ /**
+ * Tell the image it's modified; this emits the sigImageModified signal. This happens
+ * when the image needs to be saved
+ */
+ void setModified();
+
+ KisColorSpace * colorSpace() const;
+
+ // Resolution of the image == XXX: per inch?
+ double xRes();
+ double yRes();
+ void setResolution(double xres, double yres);
+
+ TQ_INT32 width() const;
+ TQ_INT32 height() const;
+
+ bool empty() const;
+
+ /**
+ * returns a paintdevice that contains the merged layers of this image, within
+ * the bounds of this image (with the colorspace and profile of this image)
+ */
+ KisPaintDeviceSP mergedImage();
+
+ /*
+ * Returns the colour of the merged image at pixel (x, y).
+ */
+ KisColor mergedPixel(TQ_INT32 x, TQ_INT32 y);
+
+ /// Creates a new paint layer with the specified properties, adds it to the image, and returns it.
+ KisLayerSP newLayer(const TQString& name, TQ_UINT8 opacity,
+ const KisCompositeOp& compositeOp = KisCompositeOp(), KisColorSpace * colorstrategy = 0);
+
+ /// Get the active painting device. Returns 0 if the active layer does not have a paint device.
+ KisPaintDeviceSP activeDevice();
+
+ void setLayerProperties(KisLayerSP layer, TQ_UINT8 opacity, const KisCompositeOp& compositeOp, const TQString& name);
+
+ KisGroupLayerSP rootLayer() const;
+ KisLayerSP activeLayer() const;
+
+ /// Return the projection; that is, the complete, composited representation
+ /// of this image.
+ KisPaintDeviceSP projection();
+
+ KisLayerSP activate(KisLayerSP layer);
+ KisLayerSP findLayer(const TQString& name) const;
+ KisLayerSP findLayer(int id) const;
+
+ /// Move layer to specified position
+ bool moveLayer(KisLayerSP layer, KisGroupLayerSP tqparent, KisLayerSP aboveThis);
+
+ /**
+ * Add an already existing layer to the image. The layer is put on top
+ * of the layers in the specified layergroup
+ * @param layer the layer to be added
+ * @param tqparent the tqparent layer
+ */
+ bool addLayer(KisLayerSP layer, KisGroupLayerSP tqparent);
+
+ /**
+ * Add already existing layer to image.
+ *
+ * @param layer the layer to be added
+ * @param tqparent the tqparent layer
+ * @param aboveThis in the list with child layers of the specified
+ * tqparent, add this layer above the specified sibling.
+ * if 0, the layer is put in the lowermost position in
+ * its group.
+ * @param notify If true, the image is immediately recomposited, if false,
+ * no recomposition is done yet. The added layer is all
+ *
+ * returns false if adding the layer didn't work, true if the layer got added
+ */
+ bool addLayer(KisLayerSP layer, KisGroupLayerSP tqparent, KisLayerSP aboveThis);
+
+ /// Remove layer
+ bool removeLayer(KisLayerSP layer);
+
+ /// Move layer up one slot
+ bool raiseLayer(KisLayerSP layer);
+
+ /// Move layer down one slot
+ bool lowerLayer(KisLayerSP layer);
+
+ /// Move layer to top slot
+ bool toTop(KisLayerSP layer);
+
+ /// Move layer to bottom slot
+ bool toBottom(KisLayerSP layer);
+
+ TQ_INT32 nlayers() const;
+ TQ_INT32 nHiddenLayers() const;
+
+ KCommand *raiseLayerCommand(KisLayerSP layer);
+ KCommand *lowerLayerCommand(KisLayerSP layer);
+ KCommand *topLayerCommand(KisLayerSP layer);
+ KCommand *bottomLayerCommand(KisLayerSP layer);
+
+ /**
+ * Merge all visible layers and discard hidden ones.
+ * The resulting layer will be activated.
+ */
+ void flatten();
+
+ /**
+ * Merge the specified layer with the layer
+ * below this layer, remove the specified layer.
+ */
+ void mergeLayer(KisLayerSP l);
+
+ TQRect bounds() const;
+
+ /// use if the layers have changed _completely_ (eg. when flattening)
+ void notifyLayersChanged();
+
+ void notifyPropertyChanged(KisLayerSP layer);
+
+ void notifyImageLoaded();
+
+ void notifyLayerUpdated(KisLayerSP layer, TQRect rc);
+
+ void setColorSpace(KisColorSpace * colorSpace);
+ void setRootLayer(KisGroupLayerSP rootLayer);
+
+ //KisGuideMgr *guides() const;
+
+ /**
+ * Add an annotation for this image. This can be anything: Gamma, EXIF, etc.
+ * Note that the "icc" annotation is reserved for the colour strategies.
+ * If the annotation already exists, overwrite it with this one.
+ */
+ void addAnnotation(KisAnnotationSP annotation);
+
+ /** get the annotation with the given type, can return 0 */
+ KisAnnotationSP annotation(TQString type);
+
+ /** delete the annotation, if the image contains it */
+ void removeAnnotation(TQString type);
+
+ /**
+ * Start of an iteration over the annotations of this image (including the ICC Profile)
+ */
+ vKisAnnotationSP_it beginAnnotations();
+
+ /** end of an iteration over the annotations of this image */
+ vKisAnnotationSP_it endAnnotations();
+
+signals:
+
+ void sigActiveSelectionChanged(KisImageSP image);
+ void sigSelectionChanged(KisImageSP image);
+ void sigSelectionChanged(KisImageSP image, const TQRect& rect);
+
+ /// Emitted after a different layer is made active.
+ void sigLayerActivated(KisLayerSP layer);
+
+ /// Emitted after a layer is added: you can find out where by asking it for its tqparent(), et al.
+ void sigLayerAdded(KisLayerSP layer);
+
+ /** Emitted after a layer is removed.
+ It's no longer in the image, but still exists, so @p layer is valid.
+
+ @param layer the removed layer
+ @param tqparent the tqparent of the layer, before it was removed
+ @param wasAboveThis the layer it was above, before it was removed.
+ */
+ void sigLayerRemoved(KisLayerSP layer, KisGroupLayerSP wasParent, KisLayerSP wasAboveThis);
+
+ /** Emitted after a layer is moved to a different position under its tqparent layer, or its tqparent changes.
+
+ @param previousParent the tqparent of the layer, before it was moved
+ @param wasAboveThis the layer it was above, before it was moved.
+ */
+ void sigLayerMoved(KisLayerSP layer, KisGroupLayerSP previousParent, KisLayerSP wasAboveThis);
+
+ /// Emitted after a layer's properties (visible, locked, opacity, composite op, name, ...) change
+ void sigLayerPropertiesChanged(KisLayerSP layer);
+
+ /** Emitted when the list of layers has changed completely.
+ This means e.g. when the image is flattened, but not when it is rotated,
+ as the layers only change internally then.
+ */
+ void sigLayersChanged(KisGroupLayerSP rootLayer);
+
+ /**
+ * Emitted whenever an action has caused the image to be recomposited. This happens
+ * after calls to recomposite().
+ *
+ * @param rc The rect that has been recomposited.
+ */
+ void sigImageUpdated(TQRect rc);
+
+ /**
+ * Emitted whenever a layer is modified.
+ *
+ * @param layer The layer that has been modified.
+ * @param rc The rectangle that has been modified.
+ */
+ void sigLayerUpdated(KisLayerSP layer, TQRect rc);
+
+ /**
+ * Emitted whenever the image has been modified, so that it doesn't match with the version saved on disk.
+ */
+ void sigImageModified();
+
+ void sigSizeChanged(TQ_INT32 w, TQ_INT32 h);
+ void sigProfileChanged(KisProfile * profile);
+ void sigColorSpaceChanged(KisColorSpace* cs);
+
+
+ /// Emitted when any layer's tqmask info got updated (or when the current layer changes)
+ void sigMaskInfoChanged();
+public slots:
+ void slotSelectionChanged();
+ void slotSelectionChanged(const TQRect& r);
+
+
+private:
+ KisImage& operator=(const KisImage& rhs);
+ void init(KisUndoAdapter * adapter, TQ_INT32 width, TQ_INT32 height, KisColorSpace * colorSpace, const TQString& name);
+ void emitSizeChanged();
+
+private:
+
+ KURL m_uri;
+ TQString m_name;
+ TQString m_description;
+
+ TQ_INT32 m_width;
+ TQ_INT32 m_height;
+
+ double m_xres;
+ double m_yres;
+
+ KoUnit::Unit m_unit;
+
+ KisColorSpace * m_colorSpace;
+
+ bool m_dirty;
+ TQRect m_dirtyRect;
+
+ KisBackgroundSP m_bkg;
+
+ KisGroupLayerSP m_rootLayer; // The layers are contained in here
+ KisLayerSP m_activeLayer;
+
+ KisNameServer *m_nserver;
+ KisUndoAdapter *m_adapter;
+ //KisGuideMgr m_guides;
+
+ DCOPObject *m_dcop;
+
+ vKisAnnotationSP m_annotations;
+
+ class KisImagePrivate;
+ KisImagePrivate * m_private;
+
+};
+
+#endif // KIS_IMAGE_H_