/* * Copyright (c) 2004 Boudewijn Rempt * * 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_SELECTION_H_ #define KIS_SELECTION_H_ #include #include "kis_types.h" #include "kis_paint_device.h" #include enum enumSelectionMode { SELECTION_ADD, SELECTION_SUBTRACT }; /** * KisSelection contains a byte-map representation of a layer, where * the value of a byte signifies whether a corresponding pixel is selected, or not. * * NOTE: If you need to manually call emitSelectionChanged on the owner paint device * of a selection. KisSelection does not emit any signals by itself because * often you want to combine several actions in to perfom one operation and you * do not want recomposition to happen all the time. */ class KRITACORE_EXPORT KisSelection : public KisPaintDevice { typedef KisPaintDevice super; public: /** * Create a new KisSelection * @param dev the parent paint device. The selection will never be bigger than the parent * paint device. */ KisSelection(KisPaintDeviceSP dev); /** * Create a new KisSelection. This selection will not have a parent paint device. */ KisSelection(); /** * Copy the selection */ KisSelection(const KisSelection& rhs); virtual ~KisSelection(); // Returns selectedness, or 0 if invalid coordinates TQ_UINT8 selected(TQ_INT32 x, TQ_INT32 y); void setSelected(TQ_INT32 x, TQ_INT32 y, TQ_UINT8 s); TQImage maskImage(); void select(TQRect r); void invert(); void clear(TQRect r); void clear(); /// Tests if the the rect is totally outside the selection bool isTotallyUnselected(TQRect r); /** * Tests if the the rect is totally outside the selection, but uses selectedRect * instead of selectedRect, and this is faster (but might deliver false positives!) * * XXX: This comment makes no sense anymore! (BSAR) */ bool isProbablyTotallyUnselected(TQRect r); /** * Rough, but fastish way of determining the area * of the tiles used by the selection. */ TQRect selectedRect() const; /** * Slow, but exact way of determining the rectangle * that encloses the selection */ TQRect selectedExactRect() const; void paintSelection(TQImage img, TQ_INT32 x, TQ_INT32 y, TQ_INT32 w, TQ_INT32 h); void paintSelection(TQImage img, const TQRect& scaledImageRect, const TQSize& scaledImageSize, const TQSize& imageSize); void startCachingExactRect(); void stopCachingExactRect(); // if the parent layer is interested in keeping up to date with the dirtyness // of this layer, set to true void setInterestedInDirtyness(bool b) { m_dirty = b; } bool interestedInDirtyness() const { return m_dirty; } virtual void setDirty(const TQRect & rc); virtual void setDirty(); inline KisPaintDeviceSP parentPaintDevice() { return m_parentPaintDevice; } private: void paintUniformSelectionRegion(TQImage img, const TQRect& imageRect, const TQRegion& uniformRegion); private: // We don't want these methods to be used on selections: void extent(TQ_INT32 &x, TQ_INT32 &y, TQ_INT32 &w, TQ_INT32 &h) const { KisPaintDevice::extent(x,y,w,h); } TQRect extent() const { return KisPaintDevice::extent(); } void exactBounds(TQ_INT32 &x, TQ_INT32 &y, TQ_INT32 &w, TQ_INT32 &h) const { return KisPaintDevice::exactBounds(x,y,w,h); } TQRect exactBounds() const { return KisPaintDevice::exactBounds(); } TQRect exactBoundsOldMethod() const { return KisPaintDevice::exactBoundsOldMethod(); } TQRect exactBoundsImprovedOldMethod() const { return KisPaintDevice::exactBoundsImprovedOldMethod(); } private: KisPaintDeviceSP m_parentPaintDevice; bool m_doCacheExactRect; TQRect m_cachedExactRect; bool m_dirty; }; #endif // KIS_SELECTION_H_